﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Linq;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Media;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using DevExpress.Utils;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using JetRetail.Forms;
using MercFPrtX;

namespace JetRetail
{
    public partial class MainForm : Form
    {
        int iRegistratorType; 
        
        //FprnM1C.IFprnM45 Atol;
        DrvFRLib.IDrvFR47 ShtrihM; //--=Убрал 25.04
        //DrvFRLib.DrvFR ShtrihM;
        DrvDspl.v1_2Class Display;
        //---
        private MercFPrtX.MercuryFPrtX Gepard;
        //---
         //DrvDspl.Iv1_2 Display;
        public JetRetailDB DB;
        string sDefaultBuyer;
        SoundPlayer SetCashier, AddCheckPosition, PressButton;
        int iCashierKey, iPositionKey;
        int iCheckKey;
        decimal deTotalAmount=0, deAccepted;
        string sCashier;
        decimal deTotalDiscount;
        bool bFlInsertString=false;
       
        int iRowLastClic = -1; // переменная для хранения индекса, который показывает по какой ячейке был выполнен клик
        string strDel = "";
        int iFocusEndControll=-1;
        int iIndexRowLastEdit=0;
        string strLastValueCount="1";
        bool bflEnterOn = false;
        frmReportFromSertificate formEditValue;
        int iIndexRowInsertString = -1;
        bool bInsertSt = false;
        bool bShowEditor = false;
        bool bFlShange = true; //false;
        List<ПолучитьПозицииЧекаResult> listRes;
        Dictionary<int, string> DictList;
        int iError = 0;
        bool bTilda = false;
        Int32 strLastValueKey = 0;
        bool bShowShearch = false; // флаг используется для управления передачей фокуса на строку поиска
        JetRetail.WorkSetting WorkSet;
        bool bFlOplata = false;
        System.String sgepAccount = "";
        private int ichNum = 0;
        private Boolean bPrintCopy = false;
        private bool bDiscountCheck = false;
        private bool bIsPharmacy; // признак РТТ (true - аптека, false - магазин)
        private string strCompanyNameForVm8119;
        private string strRTTForVm8119;
        private string strOperationTimeForVm8119;
        private string strOperationTimeWorkDayForVm8119;
        private string strOperationTimeHoliDayForVm8119;
        private string strAdressVm8119;
        private int iCopyCheckAfterDiscountCheck=0;
        private int iCountPositionForMessageByMustHaveInApt;
        private int iCountPositionForMessageByMustHaveBelInApt;

        public static MainForm Instance;

        //public MainForm(string sConnectionString, string sInterfaceType, string sRegistratorType)
        public MainForm()
        {
            InitializeComponent();
            try
            {
                Instance = this;
                WorkSet = new WorkSetting();

                UseBackColorFor();

                iRegistratorType = WorkSet.GetRegistratorType();
                iCopyCheckAfterDiscountCheck = WorkSet.GetParamCopyCheckAfterDiscountCheck();
                iCountPositionForMessageByMustHaveInApt = WorkSet.GetCountPositionForMessageByMustHaveInApt();
                iCountPositionForMessageByMustHaveBelInApt = WorkSet.GetCountPositionForMessageByMustHaveBelInApt();

                if (WorkSet.GetInterfaceType() == 1)
                {
                    grdViewGoods.Columns["Серия"].Visible = false;
                    grdViewGoods.Columns["СрокГодности"].Visible = false;

                    grdViewGoods.Columns["Характеристики"].OptionsColumn.FixedWidth = false;
                    
                    grdViewGoods.Columns["Характеристики"].MinWidth = 90;
                    grdViewGoods.Columns["Характеристики"].MaxWidth = 250;
                    grdViewGoods.Columns["Характеристики"].Caption = "Характеристика";

                    grdViewGoods.Columns["Характеристики"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Default; 


                    // --- grdViewPositions ---
                    grdViewPositions.Columns["Характеристики"].Visible = true;
                    grdViewPositions.Columns["Характеристики"].MinWidth = 90;
                    grdViewPositions.Columns["Характеристики"].MaxWidth = 250;
                    grdViewPositions.Columns["Характеристики"].Caption = "Характеристика";
                    grdViewPositions.Columns["Характеристики"].OptionsColumn.FixedWidth = false;
                    grdViewPositions.Columns["Характеристики"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Default; 

                    grdViewPositions.Columns["Серия"].Visible = false;
                    grdViewPositions.Columns["СрокГодности"].Visible = false;
                    grdViewPositions.Columns["Div"].Visible = false;

                    bIsPharmacy = false; // признак, что РТТ - магазин

                }
                else //sInterfaceType == "2"
                {
                    N000.Text = "~";
                    bIsPharmacy = true; // признак, что РТТ - аптека 
                }

                if (InitRegistrator() == false) // подключаемся  к ККМ
                {
                    Close();
                }
                else
                {
                    if (InitDisplay() == false) Close(); // подключаемся к дисплею
                    else
                    {
                        
                        DB = new JetRetailDB(WorkSet.GetConnectionString());

                        TestConnectionAndExit(DB);
                        
                        ISingleResult<ПолучитьПокупателяResult> Result = DB.ПолучитьПокупателя("");
                        foreach (ПолучитьПокупателяResult DataSet in Result) sDefaultBuyer = DataSet.Имя;
                        
                        //SetCashier = new SoundPlayer("C:\\Program Files\\JetRetail\\SetCashier.wav");
                        //AddCheckPosition = new SoundPlayer("C:\\Program Files\\JetRetail\\AddCheckPosition.wav");
                        //PressButton = new SoundPlayer("C:\\Program Files\\JetRetail\\PressButton.wav");

                        GetCashierForm GetCashier = new GetCashierForm(DB);
                        GetCashier.ShowDialog(); // показываем форму ввода пароля касира
                        if (GetCashier.iCashierKey == 0) Close();
                        else
                        {
                            iCashierKey = GetCashier.iCashierKey;
                            Text = "Кассир \"" + (sCashier = GetCashier.sCashierName) + "\" / Регистратор \"" + GetRegistratorSerialNumber() + "\"";
                            GetCashierNameToVM8119();
                            Version v = Assembly.GetExecutingAssembly().GetName().Version;
                            string About = string.Format(CultureInfo.InvariantCulture, @" Версия Jet: {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision);
                            Text += About;
                            
                            try
                            {
                                SetCashier.Play();
                            }
                            catch (Exception) { }

                            OpenCheck();
                        }
                        GetCashier.Dispose();

                        InitClisheFor8119(); // инициализируем шапку для для ВМ8119
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Close();
            }
        }

        /// <summary>
        /// Тестируем подключение к БД. Если оно не утановленно - завершаем работу
        /// </summary>
        /// <param name="db"></param>
        private void TestConnectionAndExit(JetRetailDB db)
        {
            try
            {
                db.Connection.Open();
            }
            catch (Exception)
            {
                ShowError("Отсутствует подключение к базе данных. Продолжение работы невозможно.");
                Environment.Exit(0); // в этом месте Application.Exit() не работает
                //Close();
            }
        }

        private void InitClisheFor8119()
        {
            if (!System.String.IsNullOrEmpty(WorkSet.GetCompanyNameForVm8119()))
            {
                strCompanyNameForVm8119 = WorkSet.GetCompanyNameForVm8119();
            }

            if (!System.String.IsNullOrEmpty(WorkSet.GetRTTForVm8119() ))
            {
               strRTTForVm8119 = WorkSet.GetRTTForVm8119();
            }

            if (!System.String.IsNullOrEmpty(WorkSet.GetAdressForVm8119()))
            {
                strAdressVm8119 = WorkSet.GetAdressForVm8119();
            }

            if (!System.String.IsNullOrEmpty(WorkSet.GetOperationTimeForVm8119()))
            {
                strOperationTimeForVm8119 = WorkSet.GetOperationTimeForVm8119();
            }

            if (!System.String.IsNullOrEmpty(WorkSet.GetOperationTimeWorkDayForVm8119() ))
            {
                strOperationTimeWorkDayForVm8119 = WorkSet.GetOperationTimeWorkDayForVm8119();
            }

            if (!System.String.IsNullOrEmpty(WorkSet.GetOperationTimeHoliDayForVm8119() ))
            {
                strOperationTimeHoliDayForVm8119 = WorkSet.GetOperationTimeHoliDayForVm8119();
            }
        }

        /// <summary>
        /// Инициализация объекта (и соединения)
        /// </summary>
        /// <returns></returns>
        bool InitRegistrator()
        {
            string strMessage="";
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                        break;
                    case 2:
                        {
                            ShtrihM = new DrvFRLib.DrvFRClass();
                            ShtrihM.Password = WorkSet.GetSchtrichPass(); //30;
                            ShtrihM.SysAdminCancelCheck();
                            
                            if (ShtrihM.ResultCode != 0)
                            {

                                if (ShtrihM.ResultCode == -1 || ShtrihM.ResultCode == -4)
                                {
                                    strMessage = "Фискальный регистратор выключен или не подключен. \nТекст ошибки: " + ShtrihM.ResultCodeDescription;
                                }
                                else
                                {
                                    if (ShtrihM.ResultCode == 115)
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        strMessage = ShtrihM.ResultCodeDescription;
                                    }
                                }

                                ShowError(strMessage);
                                return false;
                            }
                        }
                        break;
                    case 3:
                        {
                            Gepard = new MercuryFPrtX();
                            // устанавливаем параметры соединений
                            Gepard.PortNum = WorkSet.GetMercPortNum();
                            Gepard.BaudRate = WorkSet.GetMercBaudRate();
                            //Gepard.Password = "0000";
                            // открываем соединение
                            Gepard.Open();
                        
                            // устанавливаем окргуление до 10 рублей
                            Gepard.SetParameterInt(13,2);
                        }   
                        break;
                    case 4:
                        {
                            // тест связи с ВМ-8119
                            InitVm8119();
                        }
                        break;
                }

                return true;
            }
            catch (Exception e)
            {
                if (e.Message == "ККМ не отвечает")
                {
                    strMessage = "Фискальный регистратор выключен или недоступен. \nТекст ошибки: " + e.Message;
                }
                else
                {
                    strMessage = e.Message;
                }

                ShowError(strMessage);
                return false;
            }
        }

        /// <summary>
        /// Тест КСА ВМ-8119, на наличие связи. Если связи нет - выходим
        /// </summary>
        public void InitVm8119()
        {
            try
            {
                string strPathXcheck = Path.Combine(Application.StartupPath, "xcheck", "xcheck.exe");

                if (File.Exists(strPathXcheck))
                {
                    Process p = Process.Start(strPathXcheck, " test");
                    p.WaitForExit();
                    int ExitCod = p.ExitCode;

                    if (ExitCod != 0)
                    {
                        MessageBox.Show("Ответ от КСА не получен. Продолжение работы невозможно.", "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                        Environment.Exit(0); // в этом месте Application.Exit() не работает
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Получить серийный номер 
        /// </summary>
        /// <returns></returns>
        public string GetRegistratorSerialNumber()
        {
            string sSerialNumber = "";

            switch (iRegistratorType)
            {
                case 1:
                    {
                        
                    }
                    break;
                case 2:
                    {
                        //ShtrihM.Password = 30;
                        ShtrihM.Password = WorkSet.GetSchtrichPass(); 
                        if (ShtrihM.GetLongSerialNumberAndLongRNM() != 0) MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else sSerialNumber = ShtrihM.SerialNumber;
                    }
                    break;
                case 3:
                    {
                        sSerialNumber = Gepard.SerialNumber;
                    }
                    break;
                case 4:
                    {
                        sSerialNumber=WorkSet.GetSerialNumberForVm8119();
                    }
                    break;
            }

            return sSerialNumber;
        }

        /// <summary>
        /// Получить последний проведенный номер чека
        /// </summary>
        /// <returns></returns>
        public string GetRegistratorCheckNumber()
        {
            string sCheckNumber="";

            switch (iRegistratorType)
            {
                case 1:
                case 2:
                    {
                        if (ShtrihM.GetECRStatus() != 0) MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else sCheckNumber = Convert.ToString(ShtrihM.OpenDocumentNumber);
                    }
                    break;
                case 3:
                    {
                        sCheckNumber = Convert.ToString(Gepard.LastRecNumber);
                    }
                    break;
                case 4:
                    {
                        // читаем номер из файла num
                        sCheckNumber= GetLastCheckNumVm8119();
                    }
                    break;
            }
            return sCheckNumber;
        }

        /// <summary>
        /// Прочитать последний номер чека для ВМ 8119
        /// </summary>
        /// <returns></returns>
        public string GetLastCheckNumVm8119()
        {
            string strNum = "0";
            try
            {
                string strPathFileNum = Path.Combine(Application.StartupPath, "xcheck", "num.txt");
               

                if (File.Exists(strPathFileNum))
                {
                    strNum = File.ReadAllText(strPathFileNum);
                }
                else
                {
                    Random rnd = new Random();
                    strNum = Convert.ToString(rnd.Next(5000, 10000));
                }

                return strNum;
                
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return strNum;
            }
        }

        bool PrepareCheckPositionsRegistration()
        {
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                    case 2:
                        {
                            //ShtrihM.Password = 30;
                            ShtrihM.Password = WorkSet.GetSchtrichPass(); 
                            ShtrihM.SysAdminCancelCheck();

                            /*ShtrihM.FirstLineNumber = 1;
                            ShtrihM.LastLineNumber = 200;
                            if (ShtrihM.Draw() != 0) MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);*/

                            //ShtrihM.Password = 1;
                            ShtrihM.Password = WorkSet.GetSchtrichPassKassir(); 
                            //ShtrihM.Password = 30;
                            ShtrihM.CheckType = 0;
                            if (ShtrihM.OpenCheck() != 0)
                            {
                                MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return false;
                            }
                        }
                        break;
                    case 3:
                        {
                            //if (Gepard.Generation == 3 || Gepard.Generation == 7 || Gepard.Generation == 9)
                            //{
                            //    //Gepard.OpenDay(1, "Кассир", false, Gepard.Protocol);
                            //    // открытие чека продажи
                            //    Gepard.OpenFiscalDoc(TxMercOperType.motSale); // TxMercOperType.motSale равноценно 1 (продажи)
                            //}
                            //else
                            //{
                            //    // Проверяем наличие открытой кассовой смены на ККМ (флаг 0 статуса ККМ; флаг поддерживается всеми моделями).
                            //    // Если таковой нет (возвращаемое методом ПроверитьСтатусККМ() значение < 0) - автоматически открываем смену.
                            //    if (Gepard.CheckEcrStatus(0) < 0)
                            //    {
                            //        // Открываем смену: номер кассира = 1; используем краткий режим контрольной ленты (если поддерживается);
                            //        // используем тип протокола, на который компонент настроен в данный момент
                            //        Gepard.OpenDay(1, "Кассир", false, Gepard.Protocol);
                            //    }
                            //}

                            //if (Gepard.Generation == 1)
                            //    {
                            //        sgepAccount = "0";
                            //    }
                            //    else
                            //    {
                            //        sgepAccount = "";
                            //    }
                            //    // возможно здесь добавть: // Корректируем значение скидки так, чтобы оно всегда было корректным.
                            
                        }
                        break;
                }

                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        bool RegisterCheckPosition(string sName, decimal deSumWithoutDiscount, decimal deSumWithDiscount, double dQty)
        {
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                    case 2:
                        {
                            ShtrihM.StringForPrinting = sName;
                            if ((((int)((double)deSumWithoutDiscount/(dQty*10)))*10*dQty)==(double)deSumWithoutDiscount)
                            {
                                ShtrihM.Quantity = dQty;
                                ShtrihM.Price = deSumWithoutDiscount/(decimal)dQty;
                            }
                            else
                            {
                                ShtrihM.Quantity = 1;
                                ShtrihM.Price = deSumWithoutDiscount;
                            }
                            if (ShtrihM.SaleEx() != 0)
                            {
                                MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return false;
                            }

                            if (deSumWithDiscount != deSumWithoutDiscount)
                            {
                                ShtrihM.Summ1 = deSumWithoutDiscount - deSumWithDiscount;
                                ShtrihM.StringForPrinting = "";
                                if (ShtrihM.Discount() != 0)
                                {
                                    MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    return false;
                                }
                            }
                        }
                        break;
                    case 3:
                        {

                        }
                        break;
                }

                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        bool CloseRegistratorCheck(decimal deCashSum, decimal deCardSum)
        {
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                    case 2:
                        {
                            if (deTotalDiscount > 0)
                            {
                                ShtrihM.UseReceiptRibbon = true;
                                ShtrihM.UseJournalRibbon = true;
                                //ShtrihM.StringForPrinting = "------------------------------------";
                                //ShtrihM.PrintString();
                                //ShtrihM.StringForPrinting = "       АКЦИЯ - Скидки растут!       ";
                                //ShtrihM.PrintString();
                                //ShtrihM.StringForPrinting = "------------------------------------";
                                //ShtrihM.PrintString();
                                ShtrihM.StringForPrinting = "  Вы сэкономили";
                                ShtrihM.FontType = 4;
                                ShtrihM.PrintStringWithFont();
                                ShtrihM.StringForPrinting = (int)deTotalDiscount + " руб.";
                                for (int i = (18 - ShtrihM.StringForPrinting.Length) / 2; i > 0; i--) ShtrihM.StringForPrinting = " " + ShtrihM.StringForPrinting;
                                ShtrihM.PrintStringWithFont();
                                ShtrihM.StringForPrinting = "------------------------------------";
                                ShtrihM.PrintString();
                            }

                            ShtrihM.Summ1 = deCashSum;
                            ShtrihM.Summ2 = deCardSum;
                            ShtrihM.Summ3 = 0;
                            ShtrihM.Summ4 = 0;
                            ShtrihM.DiscountOnCheck = 0;
                            ShtrihM.StringForPrinting = "";
                            if (ShtrihM.CloseCheck() != 0)
                            {
                                MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return false;
                            }
                          
                        }
                        break;
                    case 3:
                        {
                        }
                        break;
                    case 4:
                        {                          
                        }
                        break;
                }

                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        void PrintXReport()
        {
            try
            {
                switch (iRegistratorType)
                {
              
                    case 1:
                    case 2:
                        {
                            //ShtrihM.Password = 30;
                            ShtrihM.Password = WorkSet.GetSchtrichPass(); 
                            if (ShtrihM.PrintReportWithoutCleaning() != 0) MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        break;
                    case 3:
                        {
                            Gepard.XReport(1);
                        }
                        break;
                    case 4:
                        {
                            ReportForVM8119("xreport");
                        }
                        break;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void ReportForVM8119(string strReportName)
        {
            try
            {
                string strPathXcheck = Path.Combine(Application.StartupPath, "xcheck", "xcheck.exe"); //" check ", strPathToСheck);

                if (File.Exists(strPathXcheck))
                {
                    Process p = Process.Start(strPathXcheck, " " + strReportName);
                    p.WaitForExit();
                    int ExitCod = p.ExitCode;

                    if (ExitCod != 0)
                    {
                        MessageBox.Show(GetMessageFromLogFileVm8119(), "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        void PrintZReport()
        {
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                    case 2:
                        {
                            //ShtrihM.Password = 30;
                            ShtrihM.Password = WorkSet.GetSchtrichPass(); 
                            if (ShtrihM.PrintReportWithCleaning() != 0) MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        break;
                    case 3:
                        {
                            Gepard.ZReport(1);
                        }
                        break;
                    case 4:
                        {
                            ReportForVM8119("zreport");
                        }
                        break;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        /// <summary>
        /// Открыть денежный ящик
        /// </summary>
        public void OpenDrawer()
        {
            try
            {
                switch (iRegistratorType)
                {
                   

                    case 1:
                        break;
                    case 2:
                        {
                            ShtrihM.OpenDrawer();
                        }
                        break;
                    case 3:
                        {
                            // Открываем денежный ящик канал 1 и 2
                            Gepard.ExternalPulse(1, 50, 50, 1);
                            Gepard.ExternalPulse(2, 50, 50, 1);
                        }
                        break;
                    case 4:
                        {
                            
                        }
                        break;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        bool InitDisplay()
        {
            switch (iRegistratorType)
            {
                case 1:
                    break;
                case 2:
                    {
                        Display = new DrvDspl.v1_2Class();
                        Display.InitialDispl();
                        Display.ClearDispl();
                    }
                    break;
                case 3:
                    {
                        Display = new DrvDspl.v1_2Class();
                        Display.InitialDispl();
                        Display.ClearDispl();
                    }
                    break;
                case 4:
                    {
                        Display = new DrvDspl.v1_2Class();
                        Display.InitialDispl();
                        Display.ClearDispl();
                    }
                    break;
            }

            return true;
        }

        void DisplayText(string sText)
        {
            switch (iRegistratorType)
            {
                case 1:
                case 2:
                    {
                        Display.ClearDispl();
                        Display.EnterStr(0, sText);
                    }
                    break;
                case 3:
                    {
                        Display.ClearDispl();
                        Display.EnterStr(0, sText);
                    }
                    break;
            }
        }

        private void OpenCheck()
        {
            grdPosition.Enabled = true;

            Buyer.Text = sDefaultBuyer;
            try
            {
                iCheckKey=DB.ОткрытьЧек(iCashierKey, GetRegistratorSerialNumber());
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            //GetCheckPositions();
            GetCheckGridPositions();
        }

        #region old

        //private void GetCheckPositions()
        //{
        //    try
        //    {
        //        //Positions.Items.Clear();

        //        ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.ПолучитьПозицииЧека(iCheckKey);
        //        decimal dePrevTotalAmount = deTotalAmount;
        //        deTotalAmount = 0;
        //        int i = 1;
        //        string[] sPosition = new string[10];
        //        foreach (ПолучитьПозицииЧекаResult DataSet in Result)
        //        {
        //            sPosition[0] = Convert.ToString(DataSet.Key);
        //            sPosition[1] = Convert.ToString(i++);
        //            sPosition[2] = DataSet.Название;
        //            sPosition[3] = DataSet.Характеристики;
        //            sPosition[4] = DataSet.Серия;
        //            sPosition[5] = (Convert.ToString(DataSet.СрокГодности)).Substring(0, 10);
        //            sPosition[6] = DecimalToString(Convert.ToDecimal(DataSet.ЦелоеКоличество));
        //            if (DataSet.ДелимостьНаЧасти != 1)
        //            {
        //                if (DataSet.ДробноеКоличество != 0) sPosition[6] += ("~" + Convert.ToString(DataSet.ДробноеКоличество));
        //                sPosition[6] += (" :" + Convert.ToString(DataSet.ДелимостьНаЧасти));
        //            }
        //            sPosition[7] = DecimalToString(Convert.ToDecimal(DataSet.ЦенаБезСкидки));
        //            sPosition[8] = DecimalToString(Convert.ToDecimal(DataSet.ПроцентСкидки));
        //            decimal deSum;
        //            sPosition[9] = DecimalToString(deSum = Convert.ToDecimal(DataSet.СуммаСоСкидкой));
        //            deTotalAmount += deSum;
        //            ListViewItem LVI = new ListViewItem(sPosition);
        //            Positions.Items.Add(LVI);
        //        }

        //        Total.Text = DecimalToString(deTotalAmount);
        //        string sDisplay;
        //        if (deTotalAmount == 0) sDisplay = "                    ";
        //        else
        //        {
        //            sDisplay = "";
        //            if ((dePrevTotalAmount = deTotalAmount - dePrevTotalAmount) != 0)
        //            {
        //                if (dePrevTotalAmount > 0) sDisplay = "+ ";
        //                else
        //                {
        //                    sDisplay = "- ";
        //                    dePrevTotalAmount *= -1;
        //                }
        //                sDisplay += DecimalToString(dePrevTotalAmount);
        //            }
        //            while (sDisplay.Length != 20) sDisplay = " " + sDisplay;
        //        }
        //        sDisplay += "ИТОГО: ";
        //        while (sDisplay.Length != 40 - DecimalToString(deTotalAmount).Length) sDisplay += " ";
        //        sDisplay += DecimalToString(deTotalAmount);

        //        DisplayText(sDisplay);

        //        Cash.Enabled = Card.Enabled = (i == 1) ? (false) : (true);

        //        /*************************/
        //        АкцияResult Line = DB.Акция(iCheckKey).First();
        //        if (Line.Триггер.Value == false) InfoLabel.Visible = false;
        //        else
        //        {
        //            InfoLabel.Text = Line.Сообщение.Replace("<br>", Environment.NewLine);
        //            InfoLabel.Visible = true;
        //        }
        //        /*************************/
        //    }
        //    catch (Exception e)
        //    {
        //        MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //    }
        //}

        #endregion

        string DecimalToString(decimal deNumber)
        {
            int i, j;
            if (deNumber >= 1000000000)
            {
                i = 10;
                j = 1000000000;
            }
            else if (deNumber >= 100000000)
            {
                i = 9;
                j = 100000000;
            }
            else if (deNumber >= 10000000)
            {
                i = 8;
                j = 10000000;
            }
            else if (deNumber >= 1000000)
            {
                i = 7;
                j = 1000000;
            }
            else if (deNumber >= 100000)
            {
                i = 6;
                j = 100000;
            }
            else if (deNumber >= 10000)
            {
                i = 5;
                j = 10000;
            }
            else if (deNumber >= 1000)
            {
                i = 4;
                j = 1000;
            }
            else if (deNumber >= 100)
            {
                i = 3;
                j = 100;
            }
            else if (deNumber >= 10)
            {
                i = 2;
                j = 10;
            }
            else
            {
                i = 1;
                j = 1;
            }

            string sNumber = "";
            for (int k = 0; k < i; k++)
            {
                sNumber += Convert.ToString(Convert.ToInt32(deNumber) / j);
                if ((k != i - 1) && ((i - k) % 3 == 1)) sNumber += " ";
                deNumber %= j;
                j /= 10;
            }

            return sNumber;
        }

        private void Search_TextChanged(object sender, EventArgs e)
        {
            SearchTimer.Stop();
            if (Search.Text == "")
            {
                if (!grdPosition.Visible)
                {
                    grdPosition.Visible = true;
                    grdGood.Visible = false;
                }
                if (grdGood.Visible)
                {
                    // очищаем грид 
                    grdGood.DataSource = null;
                }

            }
            else SearchTimer.Start();
        }



        private void Search_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 27) Search.Text = "";
        }

        private void SearchTimer_Tick(object sender, EventArgs e)
        {
            bool bIsEmployee = false;
            try
            {
                SearchTimer.Stop();

                #region  Что-то олдовое
                /*if ((deTotalAmount > 0) && (Search.Text.Length >= 6))
                {
                    if (((Search.Text[0] == 'П') || (Search.Text[0] == 'п')) && ((Search.Text[1] == 'С') || (Search.Text[1] == 'с')) && (Search.Text[2] == '-'))
                    {
                        ISingleResult<ПолучитьОстатокНаПСResult> Lines = DB.ПолучитьОстатокНаПС(Search.Text);
                        foreach (ПолучитьОстатокНаПСResult Line in Lines)
                        {
                            if (MessageBox.Show("Остаток суммы подарочного сертификата - " + Line.Остаток.Value + " руб.\n\nЗакрыть чек с оплатой сертификатом?\n\n" + ((Line.Остаток.Value >= deTotalAmount) ? ("После оплаты на сертификате останется " + (int)(Line.Остаток.Value - deTotalAmount) + " руб.") : ((int)(deTotalAmount - Line.Остаток.Value) + " руб. необходимо будет доплатить наличными или пласткартой.")), "Jet-Розница", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                            {
                                int iPaymentType = -1;
                                if (Line.Остаток.Value < deTotalAmount)
                                {
                                    if (MessageBox.Show("Произвести оплату " + (int)(deTotalAmount - Line.Остаток.Value) + " руб. наличными?\n\nОтвет \"Нет\" означает оплату ПЛАСТКАРТОЙ.", "Jet-Розница", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) iPaymentType = 0;
                                    else iPaymentType = 1;
                                }

                                bool boOK = false;
                                do
                                {
                                    try
                                    {
                                        DB.ЗакрытьЧек(iCheckKey, "[ПС]", deTotalAmount, deTotalAmount);

                                        boOK = true;
                                    }
                                    catch (Exception) { }
                                } while (!boOK);

                                boOK = false;
                                do
                                {
                                    try
                                    {
                                        DB.ЗарегистрироватьОплатуСертификатом(Line.ПС_K.Value, (iPaymentType >= 0) ? (Line.Остаток.Value) : ((int)deTotalAmount), (byte)iPaymentType);

                                        boOK = true;
                                    }
                                    catch (Exception) { }
                                } while (!boOK);

                                if (iPaymentType >= 0)
                                {
                                    ShtrihM.Password = 30;
                                    ShtrihM.SysAdminCancelCheck();

                                    ShtrihM.Password = 1;
                                    ShtrihM.CheckType = 0;
                                    if (ShtrihM.OpenCheck() != 0)
                                    {
                                        MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }

                                    ShtrihM.StringForPrinting = "";
                                    ShtrihM.Quantity = 1;
                                    ShtrihM.Price = deTotalAmount - Line.Остаток.Value;
                                    if (ShtrihM.SaleEx() != 0)
                                    {
                                        MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }

                                    ShtrihM.Summ1 = (iPaymentType == 0) ? (deTotalAmount - Line.Остаток.Value) : (0);
                                    ShtrihM.Summ2 = (iPaymentType == 0) ? (0) : (deTotalAmount - Line.Остаток.Value);
                                    ShtrihM.Summ3 = 0;
                                    ShtrihM.Summ4 = 0;
                                    ShtrihM.DiscountOnCheck = 0;
                                    ShtrihM.StringForPrinting = "";
                                    if (ShtrihM.CloseCheck() != 0)
                                    {
                                        MessageBox.Show(ShtrihM.ResultCodeDescription, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }

                                CheckClosedForm CheckClosed = new CheckClosedForm();
                                CheckClosed.ShowDialog();
                                CheckClosed.Dispose();

                                OpenCheck();
                            }

                            return;
                        }
                    }
                }*/
#endregion

                if (Search.Text[0] == '0')
                {
                    ISingleResult<ПолучитьПокупателяResult> Result = DB.ПолучитьПокупателя(Search.Text);
                    foreach (ПолучитьПокупателяResult DataSet in Result)
                    {
                        if (DataSet.Key != 0)
                        {
                            Search.Text = "";

                            DB.ИзменитьПокупателя(iCheckKey, DataSet.Key);
                            Buyer.Text = DataSet.Имя;
                            //GetCheckPositions();
                            GetCheckGridPositions();
                            try
                            {
                                SetCashier.Play();
                            }
                            catch (Exception) {}

                           
                            string sDiscount = Convert.ToString(DataSet.ПроцентСкидки);
                            bIsEmployee= Convert.ToBoolean(DataSet.IsEmployee);

                            if (!String.IsNullOrEmpty(sDiscount))
                            {
                                if (Convert.ToDouble(sDiscount) > 0 && bIsEmployee)
                                {
                                    bDiscountCheck = true;
                                }    
                            }

                            while (sDiscount[sDiscount.Length - 1] == '0') sDiscount = sDiscount.Substring(0, sDiscount.Length - 1);
                            if ((sDiscount[sDiscount.Length - 1] == ',') || (sDiscount[sDiscount.Length - 1] == '.')) sDiscount = sDiscount.Substring(0, sDiscount.Length - 1);
                            BuyerInfoForm BuyerInfo = new BuyerInfoForm(DataSet.Имя, sDiscount + "%", DecimalToString(Convert.ToDecimal(DataSet.СуммаПокупок)), Convert.ToString(DataSet.ДатаРегистрации).Substring(0, 10), (DataSet.ДатаПоследнейПокупки.Value.Year==9999)?("-"):(Convert.ToString(DataSet.ДатаПоследнейПокупки).Substring(0, 10)));
                            BuyerInfo.ShowDialog();
                            BuyerInfo.Dispose();

                            return;
                        }
                    }
                }

                if (Search.Text.Length == 8)
                {
                    ISingleResult<ПолучитьПродавцаResult> Result = DB.ПолучитьПродавца(Search.Text);
                    foreach (ПолучитьПродавцаResult DataSet in Result)
                    {
                        if (Convert.ToInt32(DataSet.Key) != 0)
                        {
                            Search.Text = "";

                            if (Convert.ToInt32(DataSet.Key) != iCashierKey)
                            {
                                iCashierKey = Convert.ToInt32(DataSet.Key);
                                DB.ИзменитьПродавца(iCheckKey, iCashierKey);
                                Text = "Кассир \"" + (sCashier = DataSet.Имя) + "\" / Регистратор \"" + GetRegistratorSerialNumber() + "\"";
                                try
                                {
                                    SetCashier.Play();
                                }
                                catch (Exception) {}
                            }
                            else
                            {
                                GetCashierForm GetCashier = new GetCashierForm(DB);
                                GetCashier.ShowDialog();
                                if (GetCashier.iCashierKey == 0) Close();
                                else
                                {
                                    iCashierKey = GetCashier.iCashierKey;
                                    DB.ИзменитьПродавца(iCheckKey, iCashierKey);
                                    Text = "Кассир \"" + (sCashier = GetCashier.sCashierName) + "\" / Регистратор \"" + GetRegistratorSerialNumber() + "\"";
                                    try
                                    {
                                        SetCashier.Play();
                                    }
                                    catch (Exception) {}
                                }
                                GetCashier.Dispose();
                            }

                            return;
                        }
                    }
                }

                bool bIsNumber=false;

                if (Search.Text.Length >= 6)
                {
                    try
                    {
                        Decimal.Parse(Search.Text);
                        bIsNumber = true;
                    }
                    catch (Exception)
                    {
                    }
                }

                // здесь выполняется "горячий" поиск
                if ((bIsNumber == false)||(DB.ДобавитьПодходящийТовар(iCheckKey, Search.Text) == 0))
                {                  
                    if (grdGood.Visible == false)
                    {
                        grdGood.Visible = true;
                        grdPosition.Visible = false;
                    }

                    //ISingleResult<ПолучитьПодходящиеТоварыResult> Result = DB.ПолучитьПодходящиеТовары(Search.Text); //ПолучитьПодходящиеТовары(Search.Text);
                    //var Result = DB.ПолучитьПодходящиеТовары(Search.Text);
                    
                    //ISingleResult<ПолучитьПодходящиеТоварыResult> Result = DB.ПолучитьПодходящиеТовары(Search.Text);
                    ISingleResult<ПолучитьПодходящиеТоварыResult> Result = DB.GetSuitableProducts(Search.Text); // <-- здесь
                    
                    LoaddvGridGood(Result); // заполняем данными грид
                }
                else
                {
                    try
                    {
                        AddCheckPosition.Play();
                    }
                    catch (Exception)
                    {
                    }

                    Search.Text = "";

                    //GetCheckPositions();
                    GetCheckGridPositions();

                    if (grdGood.Visible == true)
                    {
                        grdGood.Visible = false;
                        grdPosition.Visible = true;
                    }
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        /// <summary>
        /// Заполнение данными dvGridGood
        /// </summary>
        /// <param name="res"></param>
        private void LoaddvGridGood(ISingleResult<ПолучитьПодходящиеТоварыResult> res)
        {
            //dataGridView1.AutoGenerateColumns = false;
            List <ПолучитьПодходящиеТоварыResult> myList = new List<ПолучитьПодходящиеТоварыResult> (res);

            //if (myList.Count != 0)
            //{
                grdGood.DataSource = myList;
            //}
            //else
            //{
            //    //grdGood.DataSource = null;
            //}
            
            //dvGridGood.Refresh();
            //grdGood.DataSource = res; // ориганальный вариант
        }

        private void InsertString(string sString)
        {
            String sVal = "", strCount;
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            int i;

            if (Search.Enabled)
            {
                Search.Text = Search.Text.Substring(0, i = Search.SelectionStart) + sString + Search.Text.Substring(Search.SelectionStart + Search.SelectionLength, Search.Text.Length - (Search.SelectionStart + Search.SelectionLength));
                Search.SelectionStart = i + sString.Length;
                Search.SelectionLength = 0;
            }

            if (Accepted.Enabled && Accepted.Visible)
            {
                Accepted.Text = Accepted.Text.Substring(0, i = Accepted.SelectionStart) + sString + Accepted.Text.Substring(Accepted.SelectionStart + Accepted.SelectionLength, Accepted.Text.Length - (Accepted.SelectionStart + Accepted.SelectionLength));
                Accepted.SelectionStart = i + sString.Length;
                Accepted.SelectionLength = 0;
            }

            iIndexRowLastEdit = grdViewPositions.FocusedRowHandle; // получаем хэндл (на самом деле это простой int индекс) выделенной строки

            #region old

            /*
            if (sString == "~")
            {
                SetFocusColumnFullCountAndOnEdit();
                //SendKeys.Send("{~}");

                // считать что в сетке грида + добавить ~. Это вместо SendKeys
                strCount = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); // получаем значение ячейки
                sVal = strCount + sString;
                grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sVal); // присваиваем значени ячейке


                //txtCountValue = reTxtCount;
            }
            else
            {*/
              
           /* }*/

           




            // grdViewPositions.SetRowCellValue(iIndexRowLastEdit, clCounPositions, txtCountValue.Text);

            //txtCountValue.Text.Length;
            //-----

            //var k = dvGridPositions.SelectedRows[0];


            /*
            if (grdViewPositions.SelectedRowsCount == 0)
            {
                Search.Focus();
                Search.Text += sString;
            }
            else
            {
                if (Accepted.Visible == false)
                {
                    //CurTextBox.Text = sString;
                    //CurTextBox.Text = CurTextBox.Text.Substring(0, i = CurTextBox.SelectionStart) + sString + CurTextBox.Text.Substring(CurTextBox.SelectionStart + CurTextBox.SelectionLength, CurTextBox.TextLength - (CurTextBox.SelectionStart + CurTextBox.SelectionLength));
                    // пишем в ячейку грида

                    strCount = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); // получаем значение ячейки
                    //strLastValueCount = strCount; // присваивать значение не здесь, а где-то при клике по строке
                    sVal = strCount + sString;
                    grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sVal); // присваиваем значени ячейке

                    bInsertSt = false;
                    SetFocusColumnFullCountAndOnEdit();
                    bInsertSt = true;

                    if (sVal != "0~" && sVal != "~")
                    {
                        // закоментин, проверить...
                        //EnterKey(sVal);
                    }

                    iIndexRowInsertString = grdViewPositions.FocusedRowHandle;
                }
                else
                {
                    Accepted.Text += sString;
                }
            }
            */
        
            #endregion

        }

        /// <summary>
        /// Если начат ввод с боковой панели - заблокировать возможность ввода 
        /// непосредственно с строку грида
        /// </summary>
        private void BlockGrdPosition(bool bfl)
        {
            grdPosition.Enabled = !bfl;
            Search.Enabled = !bfl;
        }
        

        private void N0_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N0.Text);
            }
        }

        private void N1_Click(object sender, EventArgs e)
        {
            //SetFocusColumnFullCountAndOnEdit();
            //SendKeys.Send("5");
            //bFlShange = false;
            //SendKeys.Send("9");
            //{UP} 

            //BlockGrdPosition(true);

            // рабочий вариант
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N1.Text);
            }
            //MessageBox.Show("1");
            //SetFocusColumnFullCountAndOnEdit();
            //SendKeys.Send("1");
        }

        private void N2_Click(object sender, EventArgs e)
        {
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N2.Text);
            }
        }

        private void N3_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N3.Text);
            }
        }

        private void N4_Click(object sender, EventArgs e)
        {
            // BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N4.Text);
            }
        }

        private void N5_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N5.Text);
            }
        }

        private void N6_Click(object sender, EventArgs e)
        {
            // BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N6.Text);
            }
        }

        private void N7_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N7.Text);
            }
        }

        private void N8_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N8.Text);
            }
        }

        private void N9_Click(object sender, EventArgs e)
        {
            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N9.Text);
            }
        }

        private void N000_Click(object sender, EventArgs e)
        {

            //BlockGrdPosition(true);
            bFlInsertString = true;
            if (!grdViewPositions.IsEditing)
            {
                InsertString(N000.Text);
            }

            #region
            //InsertString(N000.Text);

            //SetFocusColumnFullCountAndOnEdit();
            //SendKeys.Send("{F1}");
            /*
            if (N000.Text=="~")
            {
                if ()
            }
            */
            /*
            bTilda = true;
            //BlockGrdPosition(true);
            EnableButton(false);
            bFlInsertString = true;
            InsertString(N000.Text); // рабочий вариант
            */

            /*
            SetFocusColumnFullCountAndOnEdit();
            //SendKeys.Send("{~}");
            SendKeys.Send("{F1}");
            bFlShange = false;
            */
 
            //string sVal = N000.Text;

            //if (iFocusEndControll == 0)
            //{
            //    Search.Focus();
            //    SendKeys.Send(sVal);
            //}
            //if (iFocusEndControll == 1)
            //{
            //    Accepted.Focus();
            //    SendKeys.Send(sVal);
            //}
            //if (iFocusEndControll == 2)
            //{
            //    SetFocusColumnFullCountAndOnEdit();
            //    SendKeys.Send(sVal);
            //}
            #endregion
        }

        private void EnableButton(bool bfl)
        {
            N1.Enabled = bfl;
            N2.Enabled = bfl;
            N3.Enabled = bfl;
            N4.Enabled = bfl;
            N5.Enabled = bfl;
            N6.Enabled = bfl;
            N7.Enabled = bfl;
            N8.Enabled = bfl;
            N9.Enabled = bfl;
            N0.Enabled = bfl;
            Backspace.Enabled = bfl;
        }

        private void Backspace_Click(object sender, EventArgs e)
        {
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            //---
            int i;
            if (Search.SelectionLength == 0)
            {
                if (Search.SelectionStart != 0) Search.Text = Search.Text.Remove(i = Search.SelectionStart - 1, 1);
                else i = 0;
            }
            else
            {
                Search.Text = Search.Text.Remove(i = Search.SelectionStart, Search.SelectionLength);
            }
            //Search.Focus(); // перевод фокуса тут не использовать...
            Search.SelectionStart = i;
            Search.SelectionLength = 0;

            //---
            /*
            // этот фрагмент рабочий 28.11.2012
            if (iFocusEndControll==0)
            {
                Search.Focus();
                SendKeys.Send("{BS}");
            }
            */

            if (iFocusEndControll == 1)
            {
                Accepted.Focus();
                SendKeys.Send("{BS}");
            }

            // закоментил 29,11,2012
            /*
            if (iFocusEndControll == 2)
            {
                SetFocusColumnFullCountAndOnEdit();
                SendKeys.Send("{BS}");
            }
            */
        }

        private void EnterKey(string sCellValue)
        {
            string sOldCountValue = "";
            try
            {
                string sIntPart, sFracPart;
                
                //sCellValue = grdViewPositions.EditingValue.ToString();
                //var iKey = Convert.ToInt32(grdViewPositions.GetRowCellDisplayText(grdViewPositions.FocusedRowHandle, clCounPositions));

                if (sCellValue == "")
                {
                    sCellValue = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); // работает неправильно ??? проверить
                }

                if (sCellValue.Length == 0)
                {
                    sIntPart = "";
                    sFracPart = "";
                }
                else
                {
                    int iSplitter = sCellValue.IndexOf('~');
                    if (iSplitter < 0) iSplitter = sCellValue.Length;
                    sIntPart = sCellValue.Substring(0, iSplitter);
                    if (iSplitter >= sCellValue.Length) sFracPart = "";
                    else sFracPart = sCellValue.Substring(iSplitter + 1);
                }

                

                var p = DB.ИзменитьПозициюЧека(iPositionKey, (sIntPart.Length == 0) ? (0) : (int.Parse(sIntPart)), (sFracPart.Length == 0) ? (0) : (int.Parse(sFracPart)));
                strLastValueCount = sCellValue; 
                
                bflEnterOn = true;
                // здесь вывести
                grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sCellValue); // присваиваем значени ячейке

                OK.Enabled = false;

                // здесь снимаем фокус я выделенной ячейки
                //grdViewPositions.HideEditor();
                //grdViewPositions.Focus();


                GetCheckGridPositions();

                grdViewPositions.FocusedRowHandle = iIndexRowLastEdit;// устанавливаем фокус на текущую строку

                SetFocusSearch(); // устанавливаем фокус на строку ввода товаров
                iError = 0;

            }
            catch (Exception e2)
            {
                iError = 1;
                //MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                MessageBox.Show("Запрошенного количества: " + sCellValue + " нет в наличии", "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Information );
                OK.Enabled = false;
                bflEnterOn = false;
            
                // находим в дикчинари предыдущее значение

                //sOldCountValue = DictList.Where(x => x.Key == strLastValueKey).Select(x => x.Value).ToString();

                var dList= DictList.Where(x => x.Key == strLastValueKey).Select(x => x.Value);
               
                sOldCountValue = string.Join(",", dList); // фактически преобразуем из дикчинари в строку


                grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sOldCountValue);
                

                grdViewPositions.FocusedRowHandle = iIndexRowLastEdit; // устанавливаем фокус на текущую строку
                

                // здесь обновить грид
                grdPosition.Refresh(); // добавли 30.11
                return;

            }
          
        }

        
        private void OK_Click(object sender, EventArgs e)  
        {
            String sCellValue;
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

                try
                {
                    reTxtCount_EditValueChanged(null, null);

                    sCellValue =grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); // временно 

                    if (grdViewPositions.IsEditing)
                    {
                        MessageBox.Show("Редактирование не закрыто");
                        return;
                    }
                    //Parallel.For(0, 1, i => OpenDrawer());
                    OpenDrawer(); // открываем денежный ящик
                    if (RegisterCheckPositions(deAccepted, 0, true, false, null,0,"") == true) // этот метод выполняется долго и из за него чуть "подвисает" ФР Гепард
                    {
                        string sCheckNumber = GetRegistratorCheckNumber();
                        if (CloseRegistratorCheck(deAccepted, 0) == true) CloseCheck(sCheckNumber, 0);
                    }

                    Cash.Visible = true;
                    Card.Visible = true;
                    AcceptedLabel.Visible = false;
                    Accepted.Visible = false;
                    ChangeLabel.Visible = false;
                    Change.Visible = false;
                    Cancel.Visible = false;
                    Search.Enabled = true;
                    //Positions.Enabled = true;
                    grdPosition.Enabled = true;
                    OK.Enabled = false;
                    bFlOplata = false;
                    Search.Focus();
                    if (grdPosition.Visible)
                    {
                        grdGood.Visible = true;

                        Search.Clear();
                        grdGood.DataSource = null;
                    }
                }
                catch (Exception e2)
                {
                    MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Accepted.Focus();
                }
                finally
                {
                    bPrintCopy = false;
                }
            //}
        }



        //private void Qty_Enter(object sender, EventArgs e)
        //{
        //    OK.Enabled = true;
        //}

        //private void Qty_Leave(object sender, EventArgs e)
        //{
        //    if ((N0.Focused == false) && (N1.Focused == false) && (N2.Focused == false) && (N3.Focused == false) && (N4.Focused == false) && (N5.Focused == false) && (N6.Focused == false) && (N7.Focused == false) && (N8.Focused == false) && (N9.Focused == false) && (N000.Focused == false) && (Backspace.Focused == false) && (OK.Focused == false))
        //    {
        //        OK.Enabled = false;
        //        Qty.Visible = false;
        //    }
        //}

        private void Qty_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13) OK_Click(sender, e);
            else if (e.KeyChar == 27) Search.Focus();
        }

        private void Cash_Click(object sender, EventArgs e)
        {
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            //Positions.Enabled = false;
            //grdPosition.Enabled = false;
            
            //tableLayoutPanel2.RowStyles[2].SizeType = SizeType.Absolute;
            //tableLayoutPanel2.RowStyles[2].Height = 15;
            
            if (grdPosition.Visible == false)
            {
                grdPosition.Visible = true;
                grdGood.Visible = false;
            }

            Search.Text = "";
            Search.Enabled = false;

            AcceptedLabel.Visible = true;
            Accepted.Text = "";
            Accepted.Visible = true;
            ChangeLabel.Visible = true;
            Change.Text = "";
            Change.Visible = true;
            Cancel.Visible = true;
            Cash.Visible = false;
            Card.Visible = false;

            Accepted.Focus();
        }

        private void Card_Click(object sender, EventArgs e)
        {
            try
            {
                try
                {
                    PressButton.Play();
                }
                catch (Exception)
                {
                }

                if (MessageBox.Show("Закрыть чек с оплатой через пластиковую карточку ?", "Jet-Розница",MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    grdPosition.Enabled = false;
                   
                    if (!grdPosition.Visible)
                    {
                        grdPosition.Visible = true;
                        grdGood.Visible = false;
                    }

                    Search.Text = "";

                    if (RegisterCheckPositions(0, deTotalAmount, true, false /*этот параметр неважен*/, null,0,"") == true)
                    {
                        string sCheckNumber = GetRegistratorCheckNumber();
                        if (CloseRegistratorCheck(0, deTotalAmount) == true) CloseCheck(sCheckNumber, 1);
                    }
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                bPrintCopy = false;
            }
        }

        private void Cancel_Click(object sender, EventArgs e)
        {
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            Cash.Visible = true;
            Card.Visible = true;
            AcceptedLabel.Visible = false;
            Accepted.Visible = false;
            ChangeLabel.Visible = false;
            Change.Visible = false;
            Cancel.Visible = false;
            //Positions.Enabled = true;
            grdPosition.Enabled = true;

            OK.Enabled = false;
            Search.Enabled = true;
            Search.Focus();
        }

        public int RoundTo50(decimal dSum, int iK)
        {
            int rez;
            var ost = dSum%iK;
            if (ost>=iK/2)
            {
                rez = Convert.ToInt32(Math.Round(dSum, 0) - ost + iK);
            }
            else
            {
                rez = Convert.ToInt32(Math.Round(dSum, 0) - ost);
            }
            return rez;
        }

        public bool RegisterCheckPositions(decimal deCashSum, decimal deCardSum, Boolean isSale, bool isCardReturn, List<ПолучитьПозицииЧекаResult> lstResultRet, decimal deCertificateSum, string strVm8119Return )
        {
            deTotalDiscount = 0;
            int iLineNum = 0;
            int iDepartment = 1; // номер отдела
            int iDepartmentVm8119 = 1; // номер отдела для ВМ 8119
            string sDis;
            string sDisTxt, sDisFullTxt;

            //ISingleResult<ПолучитьПозицииЧекаResult> Result=null;
            List<ПолучитьПозицииЧекаResult> Result = null;
            
            try
            {
                if (PrepareCheckPositionsRegistration() == false) return false;
                else
                {
                    //ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.ПолучитьПозицииЧека(iCheckKey);

                    if (lstResultRet == null)
                    {
                        Result = DB.GetPositionCheck(iCheckKey).ToList();
                    }
                    else
                    {
                        Result = lstResultRet;
                    }

                    switch (iRegistratorType)
                    {
                        case 1:
                        case 2:
                            {
                                foreach (ПолучитьПозицииЧекаResult DataSet in Result)
                                {
                                    string sName = DataSet.Название;
                                    //string sQty = "   * " + ((DataSet.ЦелоеКоличество == 0) ? ("") : ("" + DataSet.ЦелоеКоличество)) + ((DataSet.ДробноеКоличество % DataSet.ДелимостьНаЧасти == 0) ? ("") : (((DataSet.ЦелоеКоличество == 0) ? ("") : (" и ")) + DataSet.ДробноеКоличество + "/" + DataSet.ДелимостьНаЧасти));
                                    if (sName.Length > 40 - /*sQty.Length*/10) sName = sName.Substring(0, 40 - /*sQty.Length*/10);
                                    //sName += sQty;
                                    ShtrihM.UseReceiptRibbon = true;
                                    ShtrihM.UseJournalRibbon = true;
                                    ShtrihM.StringForPrinting = "------------------------------------";
                                    ShtrihM.PrintString();
                                    //-------------------------
                                    // оригинальный вариант
                                    //ShtrihM.StringForPrinting = DataSet.Название.Substring(0, (DataSet.Название.Length <= 36) ? (DataSet.Название.Length) : (36));
                                    //ShtrihM.PrintString();


                                    decimal kStr = Math.Ceiling(Convert.ToDecimal(DataSet.Название.Length / 36.0));
                                    List<string> lstName = new List<string>();
                                    string sNameStr = DataSet.Название;
                                    for (int i = 0; i < kStr; i++)
                                    {
                                        int lStr = sNameStr.Length;

                                        if (lStr >= 36)
                                        {
                                            lstName.Add(sNameStr.Substring(0, 36));
                                            sNameStr = sNameStr.Substring(36);
                                        }
                                        else
                                        {
                                            lstName.Add(sNameStr.Substring(0, sNameStr.Length));
                                        }
                                    }

                                    foreach (string sItem in lstName)
                                    {
                                        ShtrihM.StringForPrinting = sItem;
                                        ShtrihM.PrintString();
                                    }

                                    //---------------------------
                                    
                                    
                                    
                                    if (DataSet.Характеристики.Length > 0)
                                    {
                                        if (WorkSet.GetInterfaceType() == 1)
                                        {
                                            ShtrihM.StringForPrinting = DataSet.Характеристики; //для магазина
                                            ShtrihM.PrintString();
                                        }
                                        if (WorkSet.GetInterfaceType() == 2)
                                        {
                                            //ShtrihM.StringForPrinting = " "; //Закоментарено для аптек
                                            //ShtrihM.PrintString();
                                        }
                                    }

                                    if (RegisterCheckPosition("", Convert.ToDecimal(DataSet.СуммаБезСкидки), Convert.ToDecimal(DataSet.СуммаСоСкидкой), (double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти))) == false) return false;

                                    deTotalDiscount += (DataSet.СуммаБезСкидки.Value - DataSet.СуммаСоСкидкой.Value);
                                }

                                ShtrihM.StringForPrinting = "------------------------------------";
                                ShtrihM.PrintString();
                            }
                            break;
                        case 3:
                            {
                                bool bDis = false;

                                if (Gepard.Generation == 3 || Gepard.Generation == 7 || Gepard.Generation == 9)
                                {
                                    // проверить либо вариант 1 либо 2
                                    //Gepard.OpenDay(1, "Кассир", false, Gepard.Protocol); // (1) // ошибка не работает

                                    if (isSale)
                                    {
                                        // открытие чека продажи
                                        Gepard.OpenFiscalDoc(TxMercOperType.motSale); // TxMercOperType.motSale равноценно 1 (продажи) //(2)
                                    }
                                    else
                                    {
                                        if (isCardReturn)
                                        {
                                            // открытие чека возврата по карте
                                            Gepard.OpenFiscalDoc(TxMercOperType.motRefundCashless);
                                        }
                                        else
                                        {
                                            // открытие чека возврата за наличные
                                            Gepard.OpenFiscalDoc(TxMercOperType.motRefund);
                                        }
                                    }

                                    try
                                    {
                                        iLineNum = 0;

                                        // Добавление обязательных реквизитов:
                                        PrintHeaderForGepard(iLineNum);             // - строки клише	
                                        
                                        iLineNum = 4;                               // 4 строки идкт под клише
                                        Gepard.AddSerialNumber(0, 0, iLineNum);     // - серийный номер ККМ
                                        Gepard.AddDocNumber(0, 31, iLineNum);       // - номер документа
                                        iLineNum++;
                                        Gepard.AddTaxPayerNumber(0, 0, iLineNum);   // - ИНН
                                        iLineNum++;
                                        Gepard.AddDateTime(0, 0, iLineNum);           // - текущие дата и время  
                                        Gepard.AddReceiptNumber(0, 31, iLineNum);
                                        iLineNum++;
                                        Gepard.AddOperInfo(TxMercOperInfo.moiNumberName, 0, 0, iLineNum);	// - информация об операторе (номер + имя, если поддерживается)
                                        iLineNum++;
                                        Gepard.AddCustom("----------------------------------------", 0, 0, iLineNum);
                                        //iLineNum++;

                                        //Gepard.CloseFiscalDoc();  // Закрытие документа // тестовое место

                                        // Регистрация товаров
                                        foreach (ПолучитьПозицииЧекаResult DataSet in Result)
                                        {

                                            //if (DataSet.Название.Length>40)
                                            //{
                                                decimal kStr = Math.Ceiling(Convert.ToDecimal(DataSet.Название.Length/40.0));
                                                List<string> lstName= new List<string>();                                               
                                                string sNameStr = DataSet.Название;
                                                for (int i = 0; i < kStr; i++)
                                                {
                                                    int lStr = sNameStr.Length;
                                                    
                                                    if (lStr >= 40)
                                                    {
                                                        lstName.Add(sNameStr.Substring(0, 40));
                                                        sNameStr = sNameStr.Substring(40);
                                                    }
                                                    else
                                                    {
                                                        lstName.Add(sNameStr.Substring(0, sNameStr.Length));
                                                    }                                                  
                                                }
                                            //}

                                            foreach (string sItem in lstName)
                                            {
                                                Gepard.AddCustom(
                                                sItem,                          	// - наименование товара (не более 40 символов)
                                                0,                                  // - флаги
                                                0,                                  // - смещение по горизонтали
                                                iLineNum += 1                            // - смещение по вертикали                            
                                                );
                                            }

                                            //string sName = DataSet.Название.Substring(0, (DataSet.Название.Length <= 39) ? (DataSet.Название.Length) : (39));// DataSet.Название;
                                            
                                            //Gepard.AddCustom(
                                            //    sName,                          	// - наименование товара (не более 40 символов)
                                            //    0,                                  // - флаги
                                            //    0,                                  // - смещение по горизонтали
                                            //    iLineNum+=1                            // - смещение по вертикали                            
                                            //    );

                                            //iLineNum+=1;
                                            
                                            

                                            // --- Обрабатываем скидки ---
                                            decimal deSumWithoutDiscount = Convert.ToDecimal(DataSet.СуммаБезСкидки);
                                            decimal deSumWithDiscount = Convert.ToDecimal(DataSet.СуммаСоСкидкой);

                                            decimal dPriceWithDis = Convert.ToDecimal(DataSet.PriceWithDiscount);
                                            decimal dPriceWithoutDis = Convert.ToDecimal(DataSet.ЦенаБезСкидки);


                                            double dQty = (double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти)); //(double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти));

                                            decimal deSumExec= deSumWithDiscount/Convert.ToDecimal(dQty);

                                            //int iQty = Convert.ToInt32(c * 1000); /*(Convert.ToInt32(dQty))*1000;*/ //Convert.ToInt32(dQty * 1000);
                                            int iQty = Convert.ToInt32(dQty * 1000);
                                            var cc =Convert.ToDecimal(iQty/1000.0);
 
                                            var bb = Math.Round(dQty,3); //Convert.ToDecimal(dQty);
                                            decimal newSum;
                                            decimal newSumItog;
                                            decimal newSumItog2;
                                            

                                            // скидка присутствует
                                            if (deSumWithoutDiscount != deSumWithDiscount)
                                            {
                                                // Расчет цены с учетом скидки
                                                var a = dPriceWithDis * Convert.ToDecimal(dQty);
                                                newSum = RoundTo50(a, 50);
                                                newSumItog = newSum / cc; // var
                                                newSumItog2 = Math.Round(newSumItog); // var

                                                Gepard.AddItem(
                                                    0, 									// - тип позиции: услуга, товар или денежная сумма
                                                    newSumItog2, //newSum, //deSumExec, //dPriceWithDis,				    // - цена товара
                                                    false,							    // - товар не является тарой
                                                    iDepartment,						// - номер отдела
                                                    0,									// - код товара
                                                    0,									// - значение скидки / надбавки - здесь должно быть равно 0
                                                    iQty,//(Convert.ToInt32(dQty)) * 1000,	    // - количество товара
                                                    3,									// - число значащих цифр после десятичной точки для количества
                                                    0,									// - индекс налога
                                                    "",									// - наименование единицы измерения
                                                    0,									// - флаги
                                                    0, 									// - смещение по горизонтали
                                                    iLineNum+=1, //iLineNum + 1, 					    // - смещение по вертикали
                                                    0                                   // - смещение правой границы
                                                    );

                                                bDis = true;

                                                #region old

                                                //iLineNum++; // здесь

                                                // печатаем буфер
                                                //Gepard.PrintFiscalDocBuffer();

                                                //string sText = "Скидка :";
                                                //string sSumDiscount = Convert.ToString((int)(DataSet.СуммаБезСкидки.Value-DataSet.СуммаСоСкидкой.Value));
                                                //int k = 39 - sText.Length - sSumDiscount.Length;

                                                //sText = (k > 0)
                                                //            ? sText.PadRight(k) + sSumDiscount
                                                //            : sText += sSumDiscount;

                                                //Gepard.AddCustom(
                                                //sText,                          	// - наименование товара (не более 40 символов)
                                                //0,                                  // - флаги
                                                //0,                                  // - смещение по горизонтали
                                                //iLineNum                            // - смещение по вертикали                            
                                                //);

                                                //iLineNum++;
                                                //iLineNum++;

                                                #endregion
                                            }
                                            else
                                            {
                                                // цена без скидки
                                                //decimal dPriceNoDiscount = Convert.ToDecimal(DataSet.ЦенаБезСкидки);
                                               

                                                // Расчет для вариант без скидки"
                                                var aa = dPriceWithoutDis * Convert.ToDecimal(dQty);
                                                newSum = RoundTo50(aa, 50);
                                                newSumItog = newSum / cc;
                                                newSumItog2 = Math.Round(newSumItog);
                                                
                                                // Печать реквизита "Цена услуги"
                                                Gepard.AddItem(
                                                    0, 									// - тип позиции: услуга, товар или денежная сумма
                                                    newSumItog2,//deSumWithoutDiscount,				    // - цена товара
                                                    false,									// - товар не является тарой
                                                    iDepartment,						// - номер отдела
                                                    0,									// - код товара
                                                    0,									// - значение скидки / надбавки - здесь должно быть равно 0
                                                    iQty, //(Convert.ToInt32(dQty)) * 1000,	// - количество товара
                                                    3,									// - число значащих цифр после десятичной точки для количества
                                                    0,									// - индекс налога
                                                    "",									// - наименование единицы измерения
                                                    0,									// - флаги
                                                    0, 									// - смещение по горизонтали
                                                    iLineNum+=1,  //iLineNum + 1, 					    // - смещение по вертикали
                                                    0                                   // - смещение правой границы
                                                    );

                                                //iLineNum++; //здесь
                                            }

                                            // печатаем буфер
                                            //Gepard.PrintFiscalDocBuffer();

                                            //iLineNum++;
                                            //iLineNum++;

                                            #region Альтернативный вариант расчета цены товара

                                            //decimal deSumWithoutDiscount = Convert.ToDecimal(DataSet.СуммаБезСкидки);
                                            //decimal deSumWithDiscount = Convert.ToDecimal(DataSet.СуммаСоСкидкой);
                                            //double dQty = (double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти)); //(double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти));


                                            //if ((((int)((double)deSumWithoutDiscount / (dQty * 10))) * 10 * dQty) == (double)deSumWithoutDiscount)
                                            //{
                                            //    decimal Price = deSumWithoutDiscount/(decimal)dQty;
                                            //    // Печать реквизита "Цена услуги"
                                            //    Gepard.AddItem(
                                            //        0, 									// - тип позиции: услуга, товар или денежная сумма
                                            //        Price,				                // - цена товара
                                            //        false,							    // - товар не является тарой
                                            //        iDepartment,						// - номер отдела
                                            //        0,									// - код товара
                                            //        0,									// - значение скидки / надбавки - здесь должно быть равно 0
                                            //        (Convert.ToInt32(dQty)) * 1000,	// - количество товара
                                            //        3,									// - число значащих цифр после десятичной точки для количества
                                            //        0,									// - индекс налога
                                            //        "",									// - наименование единицы измерения
                                            //        0,									// - флаги
                                            //        0, 									// - смещение по горизонтали
                                            //        iLineNum+1, 					    // - смещение по вертикали
                                            //        0                                   // - смещение правой границы
                                            //        );
                                            //}
                                            //else
                                            //{
                                            //    decimal Price = deSumWithoutDiscount;
                                            //    // Печать реквизита "Цена услуги"
                                            //    Gepard.AddItem(
                                            //        0, 									// - тип позиции: услуга, товар или денежная сумма
                                            //        Price,				                // - цена товара
                                            //        false,							    // - товар не является тарой
                                            //        iDepartment,						// - номер отдела
                                            //        0,									// - код товара
                                            //        0,									// - значение скидки / надбавки - здесь должно быть равно 0
                                            //        (Convert.ToInt32(1)) * 1000,	// - количество товара
                                            //        3,									// - число значащих цифр после десятичной точки для количества
                                            //        0,									// - индекс налога
                                            //        "",									// - наименование единицы измерения
                                            //        0,									// - флаги
                                            //        0, 									// - смещение по горизонтали
                                            //        iLineNum + 1, 					    // - смещение по вертикали
                                            //        0                                   // - смещение правой границы
                                            //        );
                                            //}

                                            #endregion



                                            //Decimal? dPriceNoDiscount = DataSet.ЦенаБезСкидки;
                                            //// Печать реквизита "Цена услуги"
                                            //Gepard.AddItem(
                                            //    0, 									// - тип позиции: услуга, товар или денежная сумма
                                            //    dPriceNoDiscount.Value,				// - цена товара
                                            //    false,									// - товар не является тарой
                                            //    iDepartment,						// - номер отдела
                                            //    0,									// - код товара
                                            //    0,									// - значение скидки / надбавки - здесь должно быть равно 0
                                            //    (Convert.ToInt32(DataSet.FullCount)) * 1000,	// - количество товара
                                            //    3,									// - число значащих цифр после десятичной точки для количества
                                            //    0,									// - индекс налога
                                            //    "",									// - наименование единицы измерения
                                            //    0,									// - флаги
                                            //    0, 									// - смещение по горизонтали
                                            //    iLineNum+1, 					    // - смещение по вертикали
                                            //    0                                   // - смещение правой границы
                                            //    );
                                            //iLineNum++;
                                            //iLineNum++;

                                            //if (RegisterCheckPosition("", Convert.ToDecimal(DataSet.СуммаБезСкидки), Convert.ToDecimal(DataSet.СуммаСоСкидкой), (double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти))) == false) return false;
                                            deTotalDiscount += (DataSet.СуммаБезСкидки.Value - DataSet.СуммаСоСкидкой.Value);
                                            
                                            //iLineNum++;
                                            //iLineNum++;
                                        }

                                        // --- общая сумма сэкономленного---
                                        if (deTotalDiscount > 0)
                                        {
                                            sDis = (int)deTotalDiscount + " руб.";
                                            sDisTxt = "Вы сэкономили ";
                                            sDisFullTxt = FullString(sDisTxt, sDis);

                                            iLineNum++;
                                            Gepard.AddCustom("----------------------------------------", 0, 0, iLineNum);
                                            iLineNum++;
                                            Gepard.AddCustom(sDisFullTxt, 0, 0, iLineNum);
                                            //iLineNum++;
                                            //Gepard.AddCustom(sDis, 0, 0, iLineNum);
                                            iLineNum++;
                                            Gepard.AddCustom("----------------------------------------", 0, 0, iLineNum);
                                        }
                                        // ----------------------------------

                                        // Печать полной суммы чека
                                        Gepard.AddTotal(0,0,iLineNum+=2,0);
                                        //iLineNum++;

                                        // Печать уплаченной суммы, суммы сдачи и суммы налога выполняется только для чека продажи:
                                        if (isSale)
                                        {
                                            //TxMercPayType PayType = (deCardSum != 0) ? TxMercPayType.mptCard : TxMercPayType.mptCash;
                                            //Decimal dSum = (deCardSum != 0) ? deCardSum : deCashSum;
                                            TxMercPayType PayType = TxMercPayType.mptCash;
                                            Decimal dSum=0, dSumBeznal=0;

                                            //========================================
                                            if (deCertificateSum == 0 && (deCardSum!=0 || deCashSum!=0))
                                            {
                                                PayType = (deCardSum != 0) ? TxMercPayType.mptCard : TxMercPayType.mptCash;
                                                dSum = (deCardSum != 0) ? deCardSum : deCashSum;
                                            }
                                            if (deCertificateSum != 0 && deCardSum == 0 && deCashSum == 0)
                                            {
                                                PayType = TxMercPayType.mptCredit;
                                                dSum = deCertificateSum;
                                            }
                                            if (deCertificateSum != 0 && deCashSum != 0)
                                            {
                                                PayType = TxMercPayType.mptCashCredit;
                                                dSum = deCashSum;
                                                dSumBeznal = deCertificateSum;   
                                            }
                                            if (deCertificateSum != 0 && deCardSum != 0)
                                            {
                                                // операция не поддерживается 
                                                // у ФР Гепард нет константы в TxMercPayType, которая позволила бы 
                                                // проводить налог и оплату картой
                                                MessageBox.Show("Операция не поддерживается", "Jet-Retail", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                                                return false;
                                            }

                                            if (dSum == 0 && dSumBeznal == 0)
                                            {
                                                MessageBox.Show("Ошибка при форировани чека", "Jet-Retail", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                                return false;
                                            }

                                            //=======================================
                                           
                                            Gepard.AddPay(
                                            PayType,                            // - тип оплаты
                                            dSum,                               // - сумма наличных
                                            /*0*/dSumBeznal,                                  // - сумма безналичных
                                            "", 								// - дополнительная информация при безналичном расчете
                                            0,									// - флаги шрифта
                                            0,									// - смещение по горизонтали
                                            iLineNum+=1,						    // - смещение по вертикали
                                            0									// - смещение правой границы
                                            );
                                            iLineNum++;

                                            // печатаем буфер
                                            //Gepard.PrintFiscalDocBuffer();

                                            if (deCashSum != 0)
                                            {
                                                // Печать суммы сдачи (только для наличных). Для карточных расчетов сдачи быть недолжно
                                                Gepard.AddChange(0, 0, iLineNum, 0);
                                                iLineNum++;
                                            }

                                            Gepard.AddCustom("-----------Спасибо за покупку-----------", 0, 0, iLineNum);
                                            iLineNum++;
                                        }

                                        // Печать регистрационного номера для молдавской версии
                                        if (Gepard.EcrModel== TxMercEcrModel.mem114_1FMD)
                                        {
                                            Gepard.AddRegNumber(0,0,iLineNum);
                                            iLineNum++;
                                        }

                                       
                                        // печатаем буфер
                                        //Gepard.PrintFiscalDocBuffer();
                                        // Закрытие документа
                                        Gepard.CloseFiscalDoc();

                                        // если чек со скидкой и установлен флаг - печатаем копию чека
                                        if (iCopyCheckAfterDiscountCheck==1)
                                        {
                                            // если была скидка
                                            if (bDis)
                                            {
                                                Gepard.CopyFiscalDoc(); // напечатать копию чека
                                            }
                                            bDis = false;
                                        }


                                    }
                                    catch (Exception e)
                                    {
                                        if (GetTextRezult() != "")
                                        {
                                            MessageBox.Show(GetTextRezult() /* + " " +e.Message */, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            Gepard.CancelFiscalDoc(false);
                                            return false;
                                        }                                       
                                    }

                                    // Прогон и отрез чековой ленты:
                                    // - если нож отключен - выполняем прогон на 10 строк (под отрыв)
                                    if (Gepard.CheckDevStatus(21) > 0)
                                    {
                                        Gepard.FeedAndCut(5, true);
                                    }
                                    else
                                    {
                                        // - если автоматический отрез отключен - выполняем прогон на 10 строк (под отрыв)
                                        if (!Gepard.QueryAutocut())
                                        {
                                            Gepard.FeedAndCut(5, true);
                                        }
                                    }                                 
                                }
                                else
                                {
                                    // (Объект.Поколение = 3) ИЛИ (Объект.Поколение = 7) ИЛИ (Объект.Поколение = 9)
                                    // не реализованно
                                    //// Проверяем наличие открытой кассовой смены на ККМ (флаг 0 статуса ККМ; флаг поддерживается всеми моделями).
                                    //// Если таковой нет (возвращаемое методом ПроверитьСтатусККМ() значение < 0) - автоматически открываем смену.
                                    //if (Gepard.CheckEеcrStatus(0) < 0)
                                    //{
                                    //    // Открываем смену: номер кассира = 1; используем краткий режим контрольной ленты (если поддерживается);
                                    //    // используем тип протокола, на который компонент настроен в данный момент
                                    //    Gepard.OpenDay(1, "Кассир", false, Gepard.Protocol);
                                    //}
                                }

                                // Запрашиваем информацию об оформленном документе
                                Gepard.QueryLastDocInfo();
                                // Извлекаем номер чека
                                int iLrn = Gepard.LastRecNumber;
                                // Не все модели фискальных регистраторов поддерживают запрос номера чека. Для тех, которые не поддерживают,
                                // вместо номера чека возвращается 0. При работе с такими регистраторами возвращаем номер документа (он
                                // поддерживается всеми моделями и версиями)
                                if (iLrn == 0)
                                {
                                    iLrn = Gepard.LastDocNumber;
                                }

                                // Открываем денежный ящик канал 1 и 2
                                //Gepard.ExternalPulse(2,50,50,1);
                                //Gepard.ExternalPulse(1,50,50,1);

                                //if (Gepard.Generation == 1)
                                //{
                                //    sgepAccount = "0";
                                //}
                                //else
                                //{
                                //    sgepAccount = "";
                                //}
                                // возможно здесь добавть: // Корректируем значение скидки так, чтобы оно всегда было корректным.
                            }
                            break;
                        case 4:
                            {
                                // КСА  ВМ 8119
                                //**************************************************************************
                                
                                string strFilName = DateTime.Now +"_"+ DateTime.Now.Millisecond+".txt"; // имя файлас чеком
                                string strPathToСheck = Path.Combine(Application.StartupPath, "check", strFilName.Replace(":",".").Replace(" ","_"));
                                
                                

                                FileStream fs = new FileStream(@strPathToСheck, FileMode.OpenOrCreate, FileAccess.Write);
                                StreamWriter writer = new StreamWriter(fs,Encoding.Default);
                                writer.WriteLine("[HEADER]");
                                //writer.WriteLine();
                                writer.WriteLine("КАССИР  " + sCashier); // здесь подставить реальное FIO кассира

                                if (!System.String.IsNullOrEmpty(strCompanyNameForVm8119))
                                {
                                    writer.WriteLine(strCompanyNameForVm8119);
                                }

                                if (!System.String.IsNullOrEmpty(strRTTForVm8119))
                                {
                                    writer.WriteLine(strRTTForVm8119);
                                }

                                if (!System.String.IsNullOrEmpty(strAdressVm8119))
                                {
                                    writer.WriteLine(strAdressVm8119);
                                }

                                if (!System.String.IsNullOrEmpty(strOperationTimeForVm8119))
                                {
                                    writer.WriteLine(strOperationTimeForVm8119);
                                }

                                if (!System.String.IsNullOrEmpty(strOperationTimeWorkDayForVm8119))
                                {
                                    writer.WriteLine(strOperationTimeWorkDayForVm8119);
                                }

                                if (!System.String.IsNullOrEmpty(strOperationTimeHoliDayForVm8119))
                                {
                                    writer.WriteLine(strOperationTimeHoliDayForVm8119);
                                }
                                

                                writer.WriteLine("- - - - - - - - - - - -");
                                //writer.WriteLine("");


                                int i = 1;                  // счетчик индекса в STRING
                                int j;                      // счетчик индекса в AddInfo
                                List<string> lstNameGoods;

                                if (isSale)
                                {
                                    // Регистрация товаров
                                    foreach (ПолучитьПозицииЧекаResult DataSet in Result)
                                    {
                                        j = 1;
                                        writer.WriteLine("[STRING" + i++ + "]");

                                        lstNameGoods = GetListNameGoodsForVm8119(DataSet.Название);
                                        foreach (string sNameGood in lstNameGoods)
                                        {
                                            writer.WriteLine("AddInfo" + j++ + "=" + sNameGood);
                                        }

                                        if (DataSet.Характеристики.Length > 0)
                                        {
                                            if (!bIsPharmacy)
                                            {
                                                if (DataSet.Характеристики.Length>=24)
                                                {
                                                    writer.WriteLine("AddInfo5=" + DataSet.Характеристики.Substring(0, 24));
                                                }
                                                else
                                                {
                                                    writer.WriteLine("AddInfo5=" + DataSet.Характеристики.Substring(0, DataSet.Характеристики.Length));
                                                }
                                                
                                            }
                                            else
                                            {
                                                writer.WriteLine("AddInfo5=" + DataSet.Характеристики);
                                            }
                                        }

                                        // Разделитель (не работает)
                                        //writer.WriteLine("Description=- - - - - - - - - - - -");
                                        // отдел
                                        writer.WriteLine("Department=" + iDepartmentVm8119);


                                        // --- Обрабатываем скидки ---
                                        decimal deSumWithoutDiscount = Convert.ToDecimal(DataSet.СуммаБезСкидки);
                                        decimal deSumWithDiscount = Convert.ToDecimal(DataSet.СуммаСоСкидкой);

                                        decimal dPriceWithDis = Convert.ToDecimal(DataSet.PriceWithDiscount);
                                        decimal dPriceWithoutDis = Convert.ToDecimal(DataSet.ЦенаБезСкидки);

                                        double dQty =
                                            (double)
                                            (DataSet.ЦелоеКоличество +
                                             ((double) DataSet.ДробноеКоличество)/((double) DataSet.ДелимостьНаЧасти));
                                            //(double)(DataSet.ЦелоеКоличество + ((double)DataSet.ДробноеКоличество) / ((double)DataSet.ДелимостьНаЧасти));

                                        // скидка присутствует
                                        if (deSumWithoutDiscount != deSumWithDiscount)
                                        {
                                            writer.WriteLine("Price=" + dPriceWithoutDis);
                                            writer.WriteLine("Amount=" + deSumWithoutDiscount);
                                            writer.WriteLine("Quantity=" + dQty);
                                            writer.WriteLine("Discount=-" + (DataSet.СуммаБезСкидки.Value - DataSet.СуммаСоСкидкой.Value));
                                        }
                                        else
                                        {
                                            // скидки нет
                                            writer.WriteLine("Price=" + dPriceWithoutDis);
                                            writer.WriteLine("Amount=" + deSumWithoutDiscount);
                                            writer.WriteLine("Quantity=" + dQty);
                                            writer.WriteLine("Discount=0");
                                        }

                                        //deTotalDiscount += (DataSet.СуммаБезСкидки.Value - DataSet.СуммаСоСкидкой.Value);
                                    }
                                }
                                else
                                {
                                    writer.WriteLine("[STRING1]");
                                    writer.WriteLine("AddInfo1="+strVm8119Return);
                                    writer.WriteLine("Department=" + iDepartmentVm8119);
                                    writer.WriteLine("Price=" + Convert.ToString((deCardSum != 0) ? deCardSum : deCashSum));
                                    writer.WriteLine("Amount=" + Convert.ToString((deCardSum != 0) ? deCardSum : deCashSum));
                                    writer.WriteLine("Quantity=1");
                                    writer.WriteLine("Discount=0");
                                }

                                

                                Decimal dSum = 0, dSumSertifikat = 0;
                                string strPayType = "", strPayTypeSertifikat = "";
                               
                                // Payment0= - оплата наличными
                                // Payment1= - оплата картой
                                // Payment3= - оплата сертификатом
                                if (deCertificateSum == 0 && (deCardSum != 0 || deCashSum != 0))
                                {
                                    strPayType = (deCardSum != 0) ? "Payment1=" : "Payment0=";
                                    dSum = (deCardSum != 0) ? deCardSum : deCashSum;
                                }
                                
                                if (deCertificateSum != 0 && deCardSum == 0 && deCashSum == 0)
                                {
                                    strPayType = "Payment3=";
                                    dSum = deCertificateSum;
                                }

                                if (deCertificateSum != 0 && deCashSum != 0)
                                {
                                    strPayType = "Payment0=";
                                    strPayTypeSertifikat = "Payment3=";
                                    dSum = deCashSum;
                                    dSumSertifikat = deCertificateSum;
                                }

                                if (deCertificateSum != 0 && deCardSum != 0)
                                {
                                    strPayType = "Payment1=";
                                    strPayTypeSertifikat = "Payment3=";
                                    dSum = deCardSum;
                                    dSumSertifikat = deCertificateSum;
                                }


                                // секция итог
                                writer.WriteLine("[ITOG]");

                                if (isSale)
                                {
                                    writer.WriteLine("Refund=0"); // чек продажи
                                }
                                else
                                {
                                    writer.WriteLine("Refund=1"); // чек возврата
                                }

                                //writer.WriteLine("Discount=-" + deTotalDiscount);
                                writer.WriteLine(strPayType + dSum);

                                if (!System.String.IsNullOrEmpty(strPayTypeSertifikat))
                                {
                                    // комбинированная оплата, часть оплаты сертификатом
                                    writer.WriteLine(strPayTypeSertifikat + dSumSertifikat);
                                }


                                // закрываем txt файл с чеком
                                writer.Close();


                                string strPathXcheck = Path.Combine(Application.StartupPath, "xcheck", "xcheck.exe"); //" check ", strPathToСheck);

                                if (File.Exists(strPathXcheck))
                                {
                                    Process p = Process.Start(strPathXcheck, " check " + strPathToСheck);
                                    p.WaitForExit();
                                    int ExitCod = p.ExitCode;

                                    if (ExitCod != 0)
                                    {
                                        MessageBox.Show(GetMessageFromLogFileVm8119(),"Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1);
                                        //Environment.Exit(0); // в этом месте Application.Exit() не работает
                                        return false;
                                    }
                                }
                                //**************************************************************************
                            }
                            break;
                    }
                    return true;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Gepard.CancelFiscalDoc(false);
                return false;
            }
        }

        /// <summary>
        ///  Получить запись из лог файла (ВМ 8119)
        /// </summary>
        /// <returns></returns>
        private string GetMessageFromLogFileVm8119()
        {
            string strPathToLogFile;
            string strLog="";
            try
            {
                strPathToLogFile = Path.Combine(Application.StartupPath, "xcheck", "log.txt");
                if (File.Exists(strPathToLogFile))
                {
                    strLog = File.ReadAllText(strPathToLogFile,Encoding.Default);
                }
                return strLog;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return strLog;
            }
        }


        /// <summary>
        /// Получить лист с построчными названиями товара
        /// </summary>
        /// <param name="strNameGoods"></param>
        /// <returns></returns>
        private List<string> GetListNameGoodsForVm8119(string strNameGoods)
        {
            decimal kStr = Math.Ceiling(Convert.ToDecimal(strNameGoods.Length / 24.0));
            List<string> lstName = new List<string>();
            string sNameStr = strNameGoods;
            for (int i = 0; i < kStr; i++)
            {
                if (kStr == 5) break;
                int lStr = sNameStr.Length;

                if (lStr >= 24)
                {
                    lstName.Add(sNameStr.Substring(0, 24));
                    sNameStr = sNameStr.Substring(24);
                }
                else
                {
                    lstName.Add(sNameStr.Substring(0, sNameStr.Length));
                }
                
            }
            return lstName;
        }

        /// <summary>
        /// Получить строку линой 40 символов, дополненну пробелами 'Вы сэкономили     XXX руб.'
        /// </summary>
        /// <param name="sTxt">Текст что-то вроде 'Вы сэкономили'</param>
        /// <param name="sSum">сумма</param>
        /// <returns>строка из 40 символов</returns>
        private string FullString(string sTxt, string sSum)
        {
            string sText;
            int k = 40 - sTxt.Length;

            if (k > 0)
            {
                sText = sTxt;
                sText+=sSum.PadLeft(k);
            }
            else
            {
                sText = sTxt + sSum;
            }

            return sText;
        }

        private string GetTextRezult()
        {
            if (Gepard.ErrCode != 0)
            {
                return Gepard.ErrMessage;
            }
            else
            {
                return "";
            }

        }


        private void PrintHeaderForGepard(int iVal)
        {
            string strCliche = "";

            // Для ККМ, поддерживающих упреждающую печать заголовка, используем такую печать
            if ((Gepard.EcrModel == TxMercEcrModel.mem114_1F && Gepard.EcrVersion >= 3 && Gepard.EcrSubVersion >= 3*256) ||
                (Gepard.EcrModel == TxMercEcrModel.memMSK && Gepard.EcrVersion >= 1 && Gepard.EcrSubVersion >= 3*256))
            {
                for (int i=1; i<=4; i++)
                {
                    if (Gepard.QueryParameterBool(16 + i - 1))
                    {
                        strCliche += Convert.ToString(i);
                    }
                }
                // Если упреждающая печать выключена для всех строк, то добавляем строки клише в чек явным образом
                if (strCliche=="")
                {
                    PrintFullHeaderFroGepard(iVal);
                }
                else
                {
                    // Если включена упреждающая печать, то проверяем, есть ли ненапечатанные
                    // строки клише; если есть - печатаем заголовок чека вызовом метода
                    // ПечататьЗаголовок (метод напечатает только те строки, для которых включена
                    // упреждающая печать); счетчик строк Стр здесь в любом случае увеличивать
                    // не нужно, т.к. заголовок не входит в состав чека
                    for (int i=1; i<=4; i++)
                    {
                        if (strCliche.IndexOf(Convert.ToString(i)) > 0 && Gepard.QueryParameterBool(20+i-1)==false )
                        {
                            Gepard.PrintHeader();
                            break;
                        }
                    }
                }
            }
            else
            {
                // Для ККМ, не поддерживающих упреждающую печать заголовка добавляем строки клише в чек явным образом
                PrintFullHeaderFroGepard(iVal);
            }
        }

        private void PrintFullHeaderFroGepard(int iVal)
        {
            for (int i=1; i <=4; i++)
            {
                Gepard.AddHeaderLine(i, 0, 0, iVal);
                iVal++;
            }
        }

        private void CloseCheck(string sCheckNumber, int iPaymentType)
        {
            try
            {
                decimal deChange;

                if (iPaymentType == 0)
                {
                    deAccepted = decimal.Parse(Accepted.Text);
                    deChange = decimal.Parse(Change.Text);
                }
                else
                {
                    deAccepted = deTotalAmount;
                    deChange = 0;
                }
                string sDisplay = "ПОЛУЧЕНО: ";
                while (sDisplay.Length != 20 - DecimalToString(deAccepted).Length) sDisplay += " ";
                sDisplay += DecimalToString(deAccepted);
                sDisplay += "СДАЧА: ";
                while (sDisplay.Length != 40 - DecimalToString(deChange).Length) sDisplay += " ";
                sDisplay += DecimalToString(deChange);

                DisplayText(sDisplay);

                bool boOK = false;
                do
                {
                    try
                    {
                        //DB.ЗакрытьЧек(iCheckKey, sCheckNumber, deTotalAmount, (iPaymentType == 0) ? (deAccepted) : (0)); // ориганальный вариант 
                        DB.ЗакрытьЧек(iCheckKey, sCheckNumber, deTotalAmount, (iPaymentType == 0) ? (deAccepted) : (0), (bDiscountCheck) ? (1) : (0)); // модифицированный вариант
                        boOK = true;
                    }
                    catch (Exception e)
                    {
                        try
                        {
                            DB.ЗакрытьЧек(iCheckKey, sCheckNumber, deTotalAmount, (iPaymentType == 0) ? (deAccepted) : (0)); // ориганальный вариант 
                            boOK = true;
                        }
                        catch (Exception)
                        {
                        }
                    } 
                } while (!boOK);

                CheckClosedForm CheckClosed = new CheckClosedForm();
                CheckClosed.ShowDialog();
                CheckClosed.Dispose();
                bDiscountCheck = false;

                OpenCheck();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Accepted_TextChanged(object sender, EventArgs e)
        {
            decimal deChange;

            try
            {
                if (Accepted.Text.Length >8 )
                {
                    MessageBox.Show("Введено некорректное число","Jet",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                    Accepted.Text = "";
                    return;
                }
                
                deChange = (deAccepted = decimal.Parse(Accepted.Text)) - deTotalAmount;
            }
            catch (Exception)
            {
                deChange = -1;
            }

            if (deChange >= 0)
            {
                Change.Text = DecimalToString(deChange);
                OK.Enabled = true;
                bFlOplata = true;
            }
            else
            {
                Change.Text = "";
                OK.Enabled = false;
                bFlOplata = false;
            }
        }

        private void Accepted_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (OK.Enabled == true) OK_Click(sender, e);
            }
            else if (e.KeyChar == 27) Accepted.Text = "";

            if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == '.') && (Accepted.Text.IndexOf(".") == -1) && (Accepted.Text.Length != 0)))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }

        private void Goods_ItemActivate(object sender, EventArgs e)
        {
            try
            {
                DB.ДобавитьПозициюЧека(iCheckKey, int.Parse((sender as ListView).SelectedItems[0].Text));
                Search.Text = "";

                try
                {
                    AddCheckPosition.Play();
                }
                catch (Exception)
                {
                }

                //Positions.Visible = true;
                //Goods.Visible = false;

                grdPosition.Visible = true;
                grdGood.Visible = false;

                //GetCheckPositions();
                GetCheckGridPositions();
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //private void Positions_ItemActivate(object sender, EventArgs e)
        //{
        //    ListViewItem LVItem = (sender as ListView).SelectedItems[0];
        //    iPositionKey = int.Parse(LVItem.Text);
        //    Qty.Text = (LVItem.SubItems[6].Text.IndexOf(" :") >= 0) ? (LVItem.SubItems[6].Text.Substring(0, LVItem.SubItems[6].Text.IndexOf(" :"))) : (LVItem.SubItems[6].Text);
        //    Qty.Bounds = LVItem.SubItems[6].Bounds;
        //    Qty.Left += 2;
        //    Qty.Top += 1;
        //    Qty.Width += 1;
        //    Qty.Visible = true;
        //    Qty.Focus();
        //}



        private void ExtraFunctions_Click(object sender, EventArgs e)
        {
            ExtraFunctions.Visible = false;
            ExtraFunctionsMenu.Show(Cursor.Position.X, Cursor.Position.Y);
        }

        private void ExtraFunctionsMenu_Closed(object sender, ToolStripDropDownClosedEventArgs e)
        {
            ExtraFunctions.Visible = true;
        }

        private void очиститьЧекToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenCheck();
            bDiscountCheck = false;
        }

        private void напечататьXотчетToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            PrintXReport();

            //TextBox CurTextBox = (Qty.Visible == false) ? ((Accepted.Visible == false) ? (Search) : (Accepted)) : (Qty);
            //CurTextBox.Focus();
        }

        private void напечататьZотчетToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                PressButton.Play();
            }
            catch (Exception)
            {
            }

            if (MessageBox.Show("Вывести суточный отчет с гашением?", "Jet-Розница", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) PrintZReport();

            //TextBox CurTextBox = (Qty.Visible == false) ? ((Accepted.Visible == false) ? (Search) : (Accepted)) : (Qty);
            //CurTextBox.Focus();
        }

        private void добавитьДисконтнуюКартуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AddDiscountCardForm AddDiscountCard = new AddDiscountCardForm(DB);
            AddDiscountCard.ShowDialog();
            AddDiscountCard.Dispose();
        }

        private void вернутьДеньгиЗаТоварToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ReturnMoneyForm ReturnMoney = new ReturnMoneyForm(iRegistratorType, ShtrihM, Gepard);
            //ReturnMoney.mainForm = this; //!!!

            ReturnMoney.ShowDialog();
            ReturnMoney.Dispose();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            Bounds = Screen.PrimaryScreen.WorkingArea;
        }

        private void добавитьПодарочныйСертификатToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AddGiftCertificateForm AddGiftCertificate = new AddGiftCertificateForm(DB, sCashier, ShtrihM, "" + (int.Parse(GetRegistratorCheckNumber()) + 1));
            AddGiftCertificate.ShowDialog();
            AddGiftCertificate.Dispose();
        }

        private void InfoLabel_Click(object sender, EventArgs e)
        {
            try
            {
                DB.ОтметитьШаг(iCheckKey);

                InfoLabel.Visible = false;
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void напечататьКопиюЧекаToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                switch (iRegistratorType)
                {
                    case 1:
                    case 2:
                        {
                            //ShtrihM.Password = 1;
                            //ShtrihM.Password = WorkSet.GetSchtrichPassKassir(); 
                            //ShtrihM.RepeatDocument();
                            #region Вариант ручного формирования копии чека (рабочий)


                            //ShtrihM.Password = WorkSet.GetSchtrichPassKassir();
                            //ShtrihM.PrintDocumentTitle();
                            Thread.Sleep(500);

                            ShtrihM.UseReceiptRibbon = true;
                            //ShtrihM.UseJournalRibbon = true;
                            ShtrihM.UseJournalRibbon = false;
                            //MessageBox.Show(ShtrihM.StringForPrinting, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            //if (ShtrihM.StringForPrinting == "")
                            //{ShtrihM.StringForPrinting = "       ООО 'Фитобел'";}

                            //ShtrihM.StringForPrinting = "       ООО 'Фитобел'"; 
                            //ShtrihM.StringForPrinting = "        " + WorkSet.GetCopyCheckName();

                            //ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            //ShtrihM.PrintString();

                            //ShtrihM.PrintString();
                            //ShtrihM.StringForPrinting = "   ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = "------------------------------------";
                            ShtrihM.PrintString();

                            if (bPrintCopy==false)
                            {
                                ichNum = Convert.ToInt32(GetRegistratorCheckNumber());
                                bPrintCopy = true;
                            }

                            ShtrihM.StringForPrinting = "Чек №" + (ichNum/*int.Parse(GetRegistratorCheckNumber())*/) +
                                                        "(копия) от " + DateTime.Now.ToShortDateString();
                            for (int i = (36 - ShtrihM.StringForPrinting.Length) / 2; i > 0; i--)
                                ShtrihM.StringForPrinting = " " + ShtrihM.StringForPrinting;
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = "------------------------------------";
                            ShtrihM.PrintString();

                            decimal deTotal = 0;

                            //ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.ПолучитьПозицииЧека(iCheckKey);

                            //int nCheck= Convert.ToInt32(GetRegistratorCheckNumber());
                            //int KeyCheck = MainForm.Instance.DB.GetCheckKeyByNum(nCheck);

                            int iLastCheckKey = DB.GetLastCheckKey(GetRegistratorSerialNumber());
                            ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.GetPositionCheck(iLastCheckKey); // ориганальный вариант DB.GetPositionCheck(iCheckKey);
                            foreach (ПолучитьПозицииЧекаResult DataSet in Result)
                            {
                                ShtrihM.StringForPrinting = DataSet.Название.Substring(0, (DataSet.Название.Length <= 36) ? (DataSet.Название.Length) : (36));
                                ShtrihM.PrintString();
                                if (DataSet.Характеристики.Length > 0)
                                {
                                    //ShtrihM.StringForPrinting = DataSet.Характеристики; //Закоментарено для аптек
                                    //ShtrihM.PrintString();
                                    ShtrihM.StringForPrinting = " "; //Закоментарено для аптек
                                    //ShtrihM.PrintString();
                                }
                                ShtrihM.StringForPrinting = DataSet.ЦелоеКоличество.Value +
                                                            ((DataSet.ДробноеКоличество.Value == 0)
                                                                 ? ("")
                                                                 : ("~" + DataSet.ДробноеКоличество.Value)) + " ед. по " +
                                                            (int)DataSet.ЦенаБезСкидки.Value + " руб.";
                                ShtrihM.PrintString();
                                if (DataSet.СуммаСоСкидкой.Value != DataSet.СуммаБезСкидки.Value)
                                {
                                    ShtrihM.StringForPrinting = "Скидка: " +
                                                                (int)
                                                                (DataSet.СуммаБезСкидки.Value -
                                                                 DataSet.СуммаСоСкидкой.Value) + " руб.";
                                    ShtrihM.PrintString();
                                }
                                ShtrihM.StringForPrinting = "Сумма: " + (int)DataSet.СуммаСоСкидкой.Value + " руб.";
                                ShtrihM.PrintString();
                                ShtrihM.StringForPrinting = "------------------------------------";
                                ShtrihM.PrintString();

                                deTotal += DataSet.СуммаСоСкидкой.Value;
                            }

                            ShtrihM.StringForPrinting = "ИТОГО: " + (int)deTotal + " руб.";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = " ";
                            ShtrihM.PrintString();

                            ShtrihM.CutType = false;
                            ShtrihM.CutCheck();

                            //ShtrihM.StringForPrinting = "            ОДО 'Фармин'";
                            //ShtrihM.PrintString();
                            ShtrihM.StringForPrinting = "   ";
                            ShtrihM.PrintString();

                            //------
                            //ShtrihM.ECRMode();
                            //var tt= ShtrihM.GetShortECRStatus();
                            //var r = ShtrihM.OperatorNumber;
                            //var o = ShtrihM.Password;

                            //ShtrihM.Password = 1;
                            //ShtrihM.RepeatDocument();

                            #endregion
                        }
                        break;
                    case 3:
                        {
                            Gepard.CopyFiscalDoc();
                        }
                        break;
                    case 4:
                        {
                            PrintCopyDocForVm8119();
                        }
                        break;
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void PrintCopyDocForVm8119()
        {
            try
            {
                string strPathXcheck = Path.Combine(Application.StartupPath, "xcheck", "xcheck.exe");

                if (File.Exists(strPathXcheck))
                {
                    Process p = Process.Start(strPathXcheck, " " + "repeat");
                    p.WaitForExit();
                    int ExitCod = p.ExitCode;

                    if (ExitCod != 0)
                    {
                        MessageBox.Show(GetMessageFromLogFileVm8119(), "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void закрытьЧекСКомбинированнойОплатойToolStripMenuItem_Click(object sender, EventArgs e)
        {
            RedeemCertificateForm RedeemCertificate = new RedeemCertificateForm(DB, iCheckKey, GetRegistratorCheckNumber(), deTotalAmount, ShtrihM);
            if (RedeemCertificate.ShowDialog() == DialogResult.OK)
            {
                CheckClosedForm CheckClosed = new CheckClosedForm();
                CheckClosed.ShowDialog();
                CheckClosed.Dispose();

                OpenCheck();
            }
            RedeemCertificate.Dispose();

            /*ЗакрытиеЧекаСКомбинированнойОплатойForm ЗакрытиеЧекаСКомбинированнойОплатой = new ЗакрытиеЧекаСКомбинированнойОплатойForm(deTotalAmount);
            if (ЗакрытиеЧекаСКомбинированнойОплатой.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    OpenDrawer();
                    if (RegisterCheckPositions() == true)
                    {
                        string sCheckNumber = GetRegistratorCheckNumber();
                        if (CloseRegistratorCheck(ЗакрытиеЧекаСКомбинированнойОплатой.deCash, ЗакрытиеЧекаСКомбинированнойОплатой.deCard) == true)
                        {
                            decimal deChange;

                            deAccepted = ЗакрытиеЧекаСКомбинированнойОплатой.deCash + ЗакрытиеЧекаСКомбинированнойОплатой.deCard;
                            deChange = ЗакрытиеЧекаСКомбинированнойОплатой.deChange;

                            string sDisplay = "ПОЛУЧЕНО: ";
                            while (sDisplay.Length != 20 - DecimalToString(deAccepted).Length) sDisplay += " ";
                            sDisplay += DecimalToString(deAccepted);
                            sDisplay += "СДАЧА: ";
                            while (sDisplay.Length != 40 - DecimalToString(deChange).Length) sDisplay += " ";
                            sDisplay += DecimalToString(deChange);

                            DisplayText(sDisplay);

                            bool boOK = false;
                            do
                            {
                                try
                                {
                                    //DB.ЗакрытьЧекСКомбинированнойОплатой(iCheckKey, sCheckNumber, deTotalAmount, ЗакрытиеЧекаСКомбинированнойОплатой.deCash, ЗакрытиеЧекаСКомбинированнойОплатой.deCard);

                                    boOK = true;
                                }
                                catch (Exception) { }
                            } while (!boOK);

                            CheckClosedForm CheckClosed = new CheckClosedForm();
                            CheckClosed.ShowDialog();
                            CheckClosed.Dispose();

                            OpenCheck();
                        }
                    }

                    Cash.Visible = true;
                    Card.Visible = true;
                    AcceptedLabel.Visible = false;
                    Accepted.Visible = false;
                    ChangeLabel.Visible = false;
                    Change.Visible = false;
                    Cancel.Visible = false;
                    Search.Enabled = true;
                    Positions.Enabled = true;
                    OK.Enabled = false;
                    Search.Focus();
                }
                catch (Exception e2)
                {
                    MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Accepted.Focus();
                }
            }
            ЗакрытиеЧекаСКомбинированнойОплатой.Dispose();*/
        }

        private void открытьДенежныйЯщикToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenDrawer();
        }

        private void напечататьОтчетПоСертификатамToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (iRegistratorType == 2)
                {
                    int iTotal = 0;

                    ShtrihM.UseReceiptRibbon = true;
                    ShtrihM.UseJournalRibbon = false;
                    //ShtrihM.PrintCliche(); // вызов этого метода вызывает ошибку временивыполнения на некоторых аптеках. Хотя версия dll одинакова на компьютере разработчика и в аптеках
                    ShtrihM.StringForPrinting = "------------------------------------";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = "Отчет по сертификатам на " + DateTime.Now.ToShortDateString();
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = "------------------------------------";
                    ShtrihM.PrintString();

                    ISingleResult<ПолучитьОтчетПоСертификатамResult> Lines = DB.ПолучитьОтчетПоСертификатам();
                    foreach (ПолучитьОтчетПоСертификатамResult Line in Lines)
                    {
                        ShtrihM.StringForPrinting = Line.ВремяЗакрытия.ToString().Substring(11) + "     ";
                        switch (Line.Контрагент.Value)
                        {
                            case 1:
                                {
                                    ShtrihM.StringForPrinting += "Дезира     ";
                                }
                                break;

                            case 2:
                                {
                                    ShtrihM.StringForPrinting += "Дриант     ";
                                }
                                break;

                            case 3:
                                {
                                    ShtrihM.StringForPrinting += "Дриант     ";
                                }
                                break;

                            case 4:
                                {
                                    ShtrihM.StringForPrinting += "Ликва      ";
                                }
                                break;

                            case 5:
                                {
                                    ShtrihM.StringForPrinting += "ОДК        ";
                                }
                                break;

                            case 6:
                                {
                                    ShtrihM.StringForPrinting += "Фармин     ";
                                }
                                break;

                            case 7:
                                {
                                    ShtrihM.StringForPrinting += "Фитобел    ";
                                }
                                break;

                            case 8:
                                {
                                    ShtrihM.StringForPrinting += "Альфармед   ";
                                }
                                break;

                            case 9:
                                {
                                    ShtrihM.StringForPrinting += "МашериИнвест";
                                }
                                break;



                            default:
                                {
                                    ShtrihM.StringForPrinting += "???        ";
                                }
                                break;
                        }
                        iTotal += (int) Line.Сумма.Value;
                        string sSum = "" + (int) Line.Сумма.Value;
                        while (sSum.Length < 6) sSum = " " + sSum;
                        ShtrihM.StringForPrinting += sSum + " руб.";
                        ShtrihM.PrintString();
                    }

                    ShtrihM.StringForPrinting = "------------------------------------";
                    ShtrihM.PrintString();
                    string sTotal = "" + iTotal;
                    while (sTotal.Length < 10) sTotal = " " + sTotal;
                    ShtrihM.StringForPrinting = "             ИТОГО: " + sTotal + " руб.";
                    ShtrihM.PrintString();

                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = " ";
                    ShtrihM.PrintString();

                    ShtrihM.CutType = false;
                    ShtrihM.CutCheck();

                    //ShtrihM.StringForPrinting = "            ООО 'Фитобел'";
                    //ShtrihM.PrintString();
                    ShtrihM.StringForPrinting = "   ";
                    ShtrihM.PrintString();
                }

                if (iRegistratorType == 3 || iRegistratorType == 4)
                {
                    MessageBox.Show("Печать отчета по сертификатом для ФР Гепард и КСА ВМ 8119 не поддерживается", "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Accepted.Focus();
            }
            
        }



        /// <summary>
        /// Добавить выбранную позицию в grdPosition
        /// </summary>
        private void GetCheckGridPositions()
        {
            try
            {
                //ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.ПолучитьПозицииЧека(iCheckKey);
                ISingleResult<ПолучитьПозицииЧекаResult> Result = DB.GetPositionCheck(iCheckKey);
                decimal dePrevTotalAmount = deTotalAmount;
                deTotalAmount = 0;
                int i = 1;
                
                listRes = LoadGridPositions(Result);

                // Показать предупреждение по обязательному перечню
                MessageFroMustHaveInApt(listRes);
                
                // записываем в дикчинари
                DictList = new Dictionary<int, string>();
                foreach (var item in listRes)
                {
                    DictList.Add(Convert.ToInt32(item.Key), item.FullCount);
                }


                i= listRes.Count+1;

                decimal deSum;
                deSum = Convert.ToDecimal(listRes.Sum(l => l.СуммаСоСкидкой));
                
                deTotalAmount += deSum;
                
                Total.Text = DecimalToString(deTotalAmount);
                
                // Этот закоментированный код выполнять в отдельном потоке
                string sDisplay;
                if (deTotalAmount == 0) sDisplay = "                    ";
                else
                {
                    sDisplay = "";
                    if ((dePrevTotalAmount = deTotalAmount - dePrevTotalAmount) != 0)
                    {
                        if (dePrevTotalAmount > 0) sDisplay = "+ ";
                        else
                        {
                            sDisplay = "- ";
                            dePrevTotalAmount *= -1;
                        }
                        sDisplay += DecimalToString(dePrevTotalAmount);
                    }
                    while (sDisplay.Length != 20) sDisplay = " " + sDisplay;
                }
                sDisplay += "ИТОГО: ";
                while (sDisplay.Length != 40 - DecimalToString(deTotalAmount).Length) sDisplay += " ";
                sDisplay += DecimalToString(deTotalAmount);

                DisplayText(sDisplay);

                Cash.Enabled = Card.Enabled = (i == 1) ? (false) : (true);

                //////////////////////
                АкцияResult Line = DB.Акция(iCheckKey).First();
                if (Line.Триггер.Value == false) InfoLabel.Visible = false;
                else
                {
                    InfoLabel.Text = Line.Сообщение.Replace("<br>", Environment.NewLine);
                    InfoLabel.Visible = true;
                }
                //////////////////////
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            //======================== ======================== 
            
        }

        private bool MessageFroMustHaveInApt(List<ПолучитьПозицииЧекаResult> lstCheckPosition)
        {
            try
            {
                // предупреждение по обязательному перечню
                if (lstCheckPosition.Count > 0 && lstCheckPosition.Last().MustHaveInApt.GetValueOrDefault())
                {
                    if (iCountPositionForMessageByMustHaveInApt != -1 && listRes.Last().RemainderInt <= iCountPositionForMessageByMustHaveInApt)
                    {
                        ShowAlertMessageFroMustHaveInApt("Внимание, остаток данного товара " + listRes.Last().RemainderInt +" или меньше целых единиц", "");
                        return true;
                    }
                }

                if (lstCheckPosition.Count > 0 && lstCheckPosition.Last().MustHaveBelInApt.GetValueOrDefault())
                {
                    if (iCountPositionForMessageByMustHaveBelInApt != -1 && listRes.Last().RemainderInt <= iCountPositionForMessageByMustHaveBelInApt)
                    {
                        ShowAlertMessageFroMustHaveInApt("Внимание, остаток данного товара " + listRes.Last().RemainderInt +" или меньше целых единиц", "");
                        return true;
                    }
                }
                return false;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

        }

        private void ShowAlertMessageFroMustHaveInApt(string strMessage, string strCaption)
        {
            try
            {
                toolTipMustHaveInApt.HideHint();
                toolTipMustHaveInApt.ShowHint(strMessage, strCaption, grdPosition, DevExpress.Utils.ToolTipLocation.TopCenter);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        /// <summary>
        /// Заполняем данными grdPosition
        /// </summary>
        /// <param name="res">list типа ISingleResult с позициями чека</param>
        /// <returns>List тип ПолучитьПозицииЧекаResult </returns>
        private List<ПолучитьПозицииЧекаResult> LoadGridPositions(ISingleResult<ПолучитьПозицииЧекаResult> res)
        {
            List<ПолучитьПозицииЧекаResult> myList = new List<ПолучитьПозицииЧекаResult>(res);         
            grdPosition.DataSource = myList;
            grdPosition.Refresh();
            grdViewPositions.FocusedRowHandle = grdViewPositions.DataRowCount - 1; // Возможно Ошибка !!!
    
            
            // old for del
            //dvGridPositions.AutoGenerateColumns = false; // спользовать только те столбцы, которые определены в шаблоне, а не всё что вернулось из источника данных 
            //dvGridPositions.DataSource = myList;
            //dvGridPositions.Refresh();
            
            return myList;
        }

        private void GetRowCont(ISingleResult<ПолучитьПозицииЧекаResult> res)
        {
            List<ПолучитьПозицииЧекаResult> myList = new List<ПолучитьПозицииЧекаResult>(res);
        }


        #region Визуально оформление строк разными цветами

        private void grdGoods_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
        {
            if (grdViewGoods.DataSource !=null)
            {

                GridView View = sender as GridView;
                string sColor = View.GetRowCellDisplayText(e.RowHandle, View.Columns["Цвет"]);
                int iColor;

                if (System.String.IsNullOrEmpty(sColor))
                {
                    iColor = 0;
                }
                else
                {
                    iColor = Convert.ToInt32(sColor);
                }

                if (iColor != 0)
                {

                    if (iColor == 1)
                    {
                        e.Appearance.BackColor = Color.Yellow;
                    }
                    else
                    {
                        if (iColor == 2)
                        {
                            e.Appearance.BackColor = Color.Red;
                            //cell.Style.BackColor = Color.Red;
                            //Utils.SetCellStyle(cell.OwningRow, cell.Style);
                        }
                        else
                        {
                            e.Appearance.BackColor = Color.Aquamarine;
                            //cell.Style.BackColor = Color.Aquamarine;
                            //Utils.SetCellStyle(cell.OwningRow, cell.Style);
                        }
                    }
                }
                else
                {
                    e.Appearance.BackColor = Color.Lime;
                    //cell.Style.BackColor = Color.Lime;
                    //Utils.SetCellStyle(cell.OwningRow, cell.Style);
                }
            }

        }
        #endregion

        /*
        /// <summary>
        /// Показываем/скрываем txtCountValue
        /// </summary>
        /// <param name="bfl"></param>
        private void VisibletxtCountValue(bool bfl)
        {
            txtCountValue.Visible = bfl;
        }
        */

        private void grdGoods_RowClick(object sender, RowClickEventArgs e)
        {
            //int iKey;
            //GridView View = sender as GridView;
            try
            {
                SetValueToCheck(e.RowHandle);
                Search.Focus(); // ставим фокус на строку поиска

                //VisibletxtCountValue(true);
                #region old
                //if (grdViewGoods.SelectedRowsCount > 0)
                //{
                //    iKey = Convert.ToInt32(View.GetRowCellDisplayText(e.RowHandle, View.Columns["Key"])); // рабочий вариант
                    
                //    var t = DB.ДобавитьПозициюЧека(iCheckKey, iKey);
                //    Search.Text = "";

                //    try
                //    {
                //        AddCheckPosition.Play();
                //    }
                //    catch (Exception)
                //    {
                //    }

                //    grdPosition.Visible = true;
                //    grdGood.Visible = false;
                //}

                //GetCheckGridPositions();
                //grdViewPositions.BestFitColumns();
                #endregion
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void SetValueToCheck(int iRowHandle)
        {
            int iKey;
            try
            {
                if (grdViewGoods.SelectedRowsCount > 0)
                {
                    iKey = Convert.ToInt32(grdViewGoods.GetRowCellDisplayText(iRowHandle, grdViewGoods.Columns["Key"])); // рабочий вариант

                    var t = DB.ДобавитьПозициюЧека(iCheckKey, iKey);
                    Search.Text = "";

                    try
                    {
                        AddCheckPosition.Play();
                    }
                    catch (Exception)
                    {
                    }

                    grdPosition.Visible = true;
                    grdGood.Visible = false;
                }
                
                GetCheckGridPositions();
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void SetCurrentCellValue(DataGridViewRow currentRow, System.String sValue)
        {
            currentRow.Cells["clCounPosition"].Value = sValue;
        }

 
        private void grdPositions_RowCellClick(object sender, RowCellClickEventArgs e)
        {
            try
            {
                GridView view = sender as GridView;

                iRowLastClic = e.RowHandle;

                if (view.FocusedColumn.FieldName!="FullCount")
                {
                    reTxtCount_Click(null, null);
                    return;
                }
                

                // записать позицию чека
                iPositionKey = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clKeyPositions));
                
                // значение в строке кол-ва до его редактирования
                strLastValueCount = Convert.ToString(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions));
                iRowLastClic = e.RowHandle; //!!!

                SetValueForCountEdit();
                SetFocusColumnFullCountAndOnEdit();

                // кнопка
                if (grdViewPositions.IsEditing)
                {
                    OK.Enabled = true;
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }




        private void reTxtCount_Click(object sender, EventArgs e)
        {
            // записать позицию чека
            iPositionKey = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clKeyPositions));
            iRowLastClic = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clNPositions))-1;
            
            SetValueForCountEdit();
            SetFocusColumnFullCountAndOnEdit();
            
            // кнопка
            if (grdViewPositions.IsEditing)
            {
                OK.Enabled = true;
            }
        }

        /// <summary>
        /// Обрезать из поля "количество" спецсимволы и привести подготовить его для редактирования
        /// </summary>
        private void SetValueForCountEdit()
        {
            String strCount, sValue, strDel = "";
            try
            {
                sValue = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); //FullCount
                //sValue = grdViewPositions.EditingValue.ToString();
                //grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sValue);
                
                if (grdViewPositions.SelectedRowsCount > 0 && sValue.IndexOf(":") !=-1 )
                {
                    if (!System.String.IsNullOrEmpty(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString()))
                    {
                        strCount = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString(); // получаем значение ячейи 
                        if (strCount.IndexOf(" :") >= 0)
                        {
                            //strDel = strCount.Substring(strCount.IndexOf(" :"), strCount.Length-1);
                            strCount = strCount.Substring(0, strCount.IndexOf(" :"));
                        }
                        grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, strCount); // присваиваем значени ячейке
                    }
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Установить фокус на столбец "FullCount" и перевести его в режим редактировани
        /// </summary>
        private void SetFocusColumnFullCountAndOnEdit()
        {
            grdViewPositions.FocusedColumn = grdViewPositions.Columns["FullCount"];
            grdViewPositions.ShowEditor(); // здесь 1:5 становится 15
        }

   
        //************************************************************************************************
        
        private void grdViewPositions_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 13)
            {

                if (grdViewPositions.FocusedColumn.FieldName != "FullCount")
                {
                    reTxtCount_Click(null, null);
                    return;
                }
            }
            else
            {
                if (e.KeyValue == 27)
                {
                    Search.Focus();
                }
            }
        }

        /// <summary>
        /// Возникает, когда фокус покидает ячейку
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void reTxtCount_Leave(object sender, EventArgs e) 
        {
            iFocusEndControll = 2;
            bool bFlPanel = false;
            string sOldCountValue="";
            

            try
            {
                if (bShowShearch)
                {
                    Search.Focus();
                    return;
                }

                if ((N0.Focused == false) && (N1.Focused == false) && (N2.Focused == false) && (N3.Focused == false) && (N4.Focused == false) && (N5.Focused == false) && (N6.Focused == false) && (N7.Focused == false) && (N8.Focused == false) && (N9.Focused == false) && (N000.Focused == false) && (Backspace.Focused == false) && (OK.Focused == false))
                {
                    OK.Enabled = false;
                }



                // если при вводе в сетке грида была нажата "~" а следовательно N000 будет в фокусе (N000.Focused==true)
                // условие выполняется, если была нажата введена цифра в сетке грида, а потом нажимается "~" на боковой панели
                //if (N000.Focused && !System.String.IsNullOrEmpty(Convert.ToString(grdViewPositions.EditingValue)))
                if (N000.Focused)
                {
                    InsertStringForGrid(N000.Text);
                    bFlPanel = true;

                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, grdViewPositions.EditingValue + N000.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }


                //if (N1.Focused && !System.String.IsNullOrEmpty(Convert.ToString(grdViewPositions.EditingValue)))
                if (N1.Focused)
                {
                    InsertStringForGrid(N1.Text);
                    bFlPanel = true;

                    #region вери вери олд

                    /*
                    string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N1.Text);
                    SetFocusColumnFullCountAndOnEdit();
                    bFlPanel = true;
                    */
                    //SetFocusColumnFullCountAndOnEdit();
                    //SendKeys.Send("1");

                       

                        ////_______
                        //int i;
                        //DevExpress.XtraEditors.TextEdit sEditor = ((DevExpress.XtraEditors.TextEdit)(grdViewPositions.ActiveEditor));

                        //sEditor.Text = sEditor.Text.Substring(0, i = sEditor.SelectionStart) + N1.Text + sEditor.Text.Substring(sEditor.SelectionStart + sEditor.SelectionLength, sEditor.Text.Length - (sEditor.SelectionStart + sEditor.SelectionLength));
                        //sEditor.SelectionStart = i + N1.Text.Length;
                        //sEditor.SelectionLength = 0;

                        //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, Convert.ToString(sEditor.Text));
                        //SendKeys.Send("{F2}");

                        //SetFocusColumnFullCountAndOnEdit();
                        //bFlPanel = true;
                        ////_______

                        #region old
                        //grdViewPositions.ActiveEditor.IsModified = true;


                        //var TextEdit = CType(gridView1.ActiveEditor, TextEdit)

                        //var key = Keys.F3; //.D1;
                        //var keyInt = (int)key;
                        //var keyStr = ((Keys)keyInt).ToString();
                        //var key2 = (Keys) Enum.Parse(typeof(Keys), keyStr);
                        
                        //Keys keyData = (Keys)0x31;

                        //var a = ((DevExpress.XtraEditors.TextEdit)(grdViewPositions.ActiveEditor));
                        //a.SendKey(new KeyEventArgs(key/*keyData*/));

                        

                        //SendKey(New KeyPressEventArgs(ChrW(symbol1)))

                        //KeyEventArgs aa = new KeyEventArgs() Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, KeyInterop.KeyFromVirtualKey(MyKeyboardHookStruct.vkCode));
                    

                        //grdViewPositions.ActiveEditor.SendKey(new KeyEventArgs(symbol1));
                        // grdViewPositions.ActiveEditor.SendKey(new KeyEventArgs(keyData));
                        //SendKeys.Send("{~}");
                        //SendKeys.Send("{1}");
                        //MessageBox.Show("Вставил");

                        //grdViewPositions.CloseEditor();
                        #endregion

                    //grdViewPositions.RefreshRowCell(iRowLastClic, clCounPositions);
                    //---
                    //var t= reTxtCount.Ed  .SelectionStart
                    //---
                    #endregion

                }

                //if (N2.Focused && !System.String.IsNullOrEmpty(Convert.ToString(grdViewPositions.EditingValue)))
                if (N2.Focused)
                {
                    InsertStringForGrid(N2.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N2.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                //if (N3.Focused && !System.String.IsNullOrEmpty(Convert.ToString(grdViewPositions.EditingValue)))
                if (N3.Focused)
                {
                    InsertStringForGrid(N3.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N3.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N4.Focused)
                {
                    InsertStringForGrid(N4.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N4.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N5.Focused)
                {
                    InsertStringForGrid(N5.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N5.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N6.Focused)
                {
                    InsertStringForGrid(N6.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N6.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N7.Focused)
                {
                    InsertStringForGrid(N7.Text);
                    bFlPanel = true;
                    
                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N7.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N8.Focused)
                {
                    InsertStringForGrid(N8.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N8.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N9.Focused)
                {
                    InsertStringForGrid(N9.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N9.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (N0.Focused)
                {
                    InsertStringForGrid(N0.Text);
                    bFlPanel = true;

                    //string sVal = Convert.ToString(grdViewPositions.EditingValue); //grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                    //grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, sVal + N0.Text);
                    //SetFocusColumnFullCountAndOnEdit();
                    //bFlPanel = true;
                }

                if (Backspace.Focused)
                {
                    int i;
                   
                    DevExpress.XtraEditors.TextEdit CurTextBox = ((DevExpress.XtraEditors.TextEdit)(grdViewPositions.ActiveEditor)); // хитрое индусское привидение типа

                    if (CurTextBox.SelectionLength == 0)
                    {
                        if (CurTextBox.SelectionStart != 0)
                        {
                            CurTextBox.Text = CurTextBox.Text.Remove(i = CurTextBox.SelectionStart - 1, 1);
                        }
                        else
                        {
                            i = 0;
                        }
                    }
                    else
                    {
                        CurTextBox.Text = CurTextBox.Text.Remove(i = CurTextBox.SelectionStart, CurTextBox.SelectionLength);
                    }
                    
                    //CurTextBox.Focus();
                    CurTextBox.SelectionStart = i;
                    CurTextBox.SelectionLength = 0;

                    grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, Convert.ToString(CurTextBox.Text));
                    SendKeys.Send("{F2}");

                    SetFocusColumnFullCountAndOnEdit();

                    bFlPanel = true;
                }

                if (OK.Focused)
                {
                    if (grdViewPositions.IsEditing)
                    {
                        if (iError == 1)
                        {
                            var dList = DictList.Where(x => x.Key == strLastValueKey).Select(x => x.Value);
                            sOldCountValue = string.Join(",", dList); // фактически преобразуем из дикчинари в строку
                            grdViewPositions.SetRowCellValue(grdViewPositions.FocusedRowHandle, clCounPositions, sOldCountValue);
                            grdViewPositions.FocusedRowHandle = iIndexRowLastEdit; // устанавливаем фокус на текущую строку
                            grdPosition.Refresh();
                            OK.Enabled = false;
                            iError = 0;
                            return;
                        }

                        if (iError != 1)
                        {
                            reTxtCount_Validating_1(null, null);
                            OK.Enabled = false;
                        }
                        bFlPanel = true;
                    }

                   /*
                    if (bFlOplata && !grdViewPositions.IsEditing)
                    {
                        OK_Click(null, null);
                        bFlPanel = true;
                        SetFocusColumnFullCountAndOnEdit();
                    }
                    */
                        
                   
                }


                    if (bFlShange == true && !System.String.IsNullOrEmpty(Convert.ToString(grdViewPositions.EditingValue)) && !bFlPanel)
                    {
                        //MessageBox.Show("Нужно завершить ввод ентером или эскейпом");
                        DialogResult valBtn = MessageBox.Show("Необходимо подтвердить введённое количество товара нажатием [Enter]. \n Да - подтвердить количество товара [Enter] \n Нет - вернуться к предыдущему количеству товара [Esc]", "Подтверждение введённого количества товара", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                        if (valBtn == DialogResult.Yes)
                        {
                            //SetFocusColumnFullCountAndOnEdit();
                            //grdViewPositions.FocusedRowHandle = iIndexRowInsertString; //***

                            reTxtCount_Validating_1(null, null);
                            //SendKeys.Send("{ENTER}");
                            //SendKeys.Send("{ENTER}");
                            
                            bFlShange = false;
                        }
                        else
                        {
                            //SetFocusColumnFullCountAndOnEdit();

                            //grdViewPositions.FocusedRowHandle = iIndexRowInsertString; //**

                            //SendKeys.Send("{ESC}");
                            //SendKeys.Send("{ESC}");
                            bFlShange = false;

                            string rez = DictList.Single(s => s.Key == iPositionKey).Value;

                            // здесь написать присваивание предыдущего значений в ячейку
                            SetFocusColumnFullCountAndOnEdit();
                            grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, rez);
                            grdViewPositions.RefreshRow(grdViewPositions.FocusedRowHandle); //***
                        }
                    }
            }
            catch(Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                bShowShearch = false;
                bFlShange = true; //***
            }

        }
        /// <summary>
        /// Ввод в грид цифр с правой панели
        /// </summary>
        /// <param name="sNValue"></param>
        private void InsertStringForGrid(System.String sNValue)
        {
            int i;
            try
            {
                if (grdViewPositions.IsEditing)
                {
                    DevExpress.XtraEditors.TextEdit sEditor = ((DevExpress.XtraEditors.TextEdit)(grdViewPositions.ActiveEditor)); // хитрое индусское привидение типа

                    sEditor.Text = sEditor.Text.Substring(0, i = sEditor.SelectionStart) + sNValue + sEditor.Text.Substring(sEditor.SelectionStart + sEditor.SelectionLength, sEditor.Text.Length - (sEditor.SelectionStart + sEditor.SelectionLength));
                    sEditor.SelectionStart = i + sNValue.Length;
                    sEditor.SelectionLength = 0;

                    grdViewPositions.SetRowCellValue(iRowLastClic, clCounPositions, Convert.ToString(sEditor.Text));
                    SendKeys.Send("{F2}");

                    SetFocusColumnFullCountAndOnEdit();
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
            }

        }



        private void grdViewPositions_Click(object sender, EventArgs e)
        {
            GridView view = (GridView)sender;
            Point pt = view.GridControl.PointToClient(Control.MousePosition);

            DoRowClick(view, pt);
        }

        private void DoRowClick(GridView view, Point pt)
        {
            GridHitInfo info = view.CalcHitInfo(pt);

            if (!info.InRow || !info.InRowCell)
            {
                SetFocusColumnFullCountAndOnEdit(); 
                //string colCaption = info.Column == null ? "N/A" : info.Column.GetCaption();
                //MessageBox.Show(string.Format("DoubleClick on row: {0}, column: {1}.", info.RowHandle, colCaption));
            }
        }

        private void reTxtCount_EditValueChanged(object sender, EventArgs e)
        {
            //string sVal="";
            //bFlInsertString = false;
            //bFlShange = true;

            //if (grdViewPositions.EditingValue != null)
            //{
            //    sVal = grdViewPositions.EditingValue.ToString();
            //}
            //else
            //{
            //    sVal= grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
            //}

            //iIndexRowLastEdit = grdViewPositions.FocusedRowHandle; // получаем хэндл (на самом деле это простой int индекс) выделенной строки
         
            //// здесь нужна проверка на регулярное выражение, типа  [цифра(любое кол-во или может не быть вообще)~цифра(любое кол-во или может не быть вообще)]
            ////  (\d)*~(\d)*

            //string sPattern = @"(\d{3,})*~(\d{3,})+";
            ////string sPattern = @"(\d)*~(\d)+";
            //Regex Reg = new Regex(sPattern);
            //bool bFl = Reg.IsMatch(sVal);

            ////string sPatternInt = @"\d";
            //string sPatternInt = @"\d{3,}";
            //Regex RegInt = new Regex(sPatternInt);


            //if (sVal.IndexOf("~") != -1 && bFl)
            //{
            //    EnterKey(sVal);
            //}

            //if (sVal.IndexOf("~") == -1 && RegInt.IsMatch(sVal) && sVal != "0" && sVal != "0~")
            //{
            //    EnterKey(sVal);
            //}
            //grdViewPositions.FocusedRowHandle = iIndexRowLastEdit; // устанавливаем фокус на текущую строку

            //return;
       }


        private void SetFocusSearch()
        {
            Search.Focus();
        }


        private void Search_Leave(object sender, EventArgs e)
        {
            iFocusEndControll = 0;
        }

        private void Accepted_Leave(object sender, EventArgs e)
        {
            iFocusEndControll = 1;
        }

        private void grdGoods_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13) // Enter
            {
                SetValueToCheck(grdViewGoods.FocusedRowHandle);
                Search.Focus(); // ставим фокус на строку поиска
            }
            if (e.KeyChar == 9) // Tab
            {
                Search.Focus();
            }
            
        }

        private void reTxtCount_KeyDown(object sender, KeyEventArgs e)
        {
            #region Вариант со switch
            //switch (e.KeyCode)
            //{
            //    case Keys.F1:
            //        SendKeys.Send("{~}");
            //        break;
            //    case Keys.Escape:
            //        if (grdViewPositions.IsEditing)
            //        {
            //            grdViewPositions.CloseEditor();
            //        }
            //        break;
            //    case Keys.Enter:
            //        reTxtCount_Validating_1(null, null);
            //        if (grdViewPositions.FocusedRowHandle >= 0)
            //        {
            //            SetValueForCountEdit();
            //            SetFocusColumnFullCountAndOnEdit();
            //            // поставть фокус ввода на строку поиска здесь 02.12 ? <len устанавливать строку всегда независимо от того, есть ли ошибка
            //            //Search.Focus();
            //        }
            //        break;
            //    case Keys.D8:
            //        break;
            //    default:
            //        reTxtCount_Validating_1(null, null);
            //        break;
            //}
            #endregion

            try
            {

                #region Старый вариант без switch
                if (e.KeyCode == Keys.F1)
                {
                    SendKeys.Send("{~}");
                }

                // если начажи ESC 
                if (e.KeyCode == Keys.Escape)
                {
                    if (grdViewPositions.IsEditing)
                    {
                        grdViewPositions.CloseEditor();
                    }
                }

                // если нажат enter после ввода с боковой панели
                if (e.KeyCode == Keys.Enter)
                {
                    reTxtCount_Validating_1(null, null);

                    if (grdViewPositions.FocusedRowHandle >= 0)
                    {
                        SetValueForCountEdit();
                        SetFocusColumnFullCountAndOnEdit();
                        // поставть фокус ввода на строку поиска здесь 02.12 ? <len устанавливать строку всегда независимо от того, есть ли ошибка
                        bShowShearch = true;
                        OK.Enabled = false;
                        //Search.Focus();
                        //bShowShearch = false;
                        //var t = 1;

                    }
                }

                // если нажаты клавиши или Tab со стрелками при вводе с боковой панели
                // внимание не обрабатваются другие клавиши, напрмер ESC ИСПРАВТЬ это 02.12.2012
                if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40 || e.KeyCode == Keys.Tab)
                {
                    reTxtCount_Validating_1(null, null);

                    if (grdViewPositions.FocusedRowHandle >= 0)
                    {
                        SetValueForCountEdit();
                        SetFocusColumnFullCountAndOnEdit();
                    }
                }
                #endregion
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
               
            }
        }

        private void reTxtCount_Validating(object sender, CancelEventArgs e)
        {
            //MessageBox.Show("reTxtCount_Validating");
        }

        private void grdViewPositions_ShowingEditor(object sender, CancelEventArgs e)
        {
            SetValueForCountEdit();
            iRowLastClic = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clNPositions)) - 1;
            strLastValueKey = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clGoodKey));

            // кнопка OK
            OK.Enabled = true;
        }


        /// <summary>
        /// Обработчик валидации
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void reTxtCount_Validating_1(object sender, CancelEventArgs e)
        {
            string sVal = "";
            bFlInsertString = false;
            bFlShange = true;

                if (grdViewPositions.EditingValue != null)
                {
                    sVal = grdViewPositions.EditingValue.ToString();
                }
                else
                {
                    sVal = grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, "FullCount").ToString();
                }

                iPositionKey = Convert.ToInt32(grdViewPositions.GetRowCellValue(grdViewPositions.FocusedRowHandle, clKeyPositions)); // фиксируем позицию_чека_key
                iIndexRowLastEdit = grdViewPositions.FocusedRowHandle; // получаем хэндл (на самом деле это простой int индекс) выделенной строки

                // Если пришла пустая строка, её нужно удалить, для этого sVal ставим в 0
                if (sVal == "")
                {
                    sVal = "0";
                }

                //MessageBox.Show("Сработала валидация");    

                EnterKey(sVal); // EnterKey вызывает метод, который сам обновит грид

                grdViewPositions.FocusedRowHandle = iIndexRowLastEdit; // устанавливаем фокус на текущую строку

                #region Проверка на регулярные выражения
                // здесь нужна проверка на регулярное выражение, типа  [цифра(любое кол-во или может не быть вообще)~цифра(любое кол-во или может не быть вообще)]
                //  (\d)*~(\d)*

                //string sPattern = @"(\d{3,})*~(\d{3,})+";
                ////string sPattern = @"(\d)*~(\d)+";
                //Regex Reg = new Regex(sPattern);
                //bool bFl = Reg.IsMatch(sVal);

                ////string sPatternInt = @"\d";
                //string sPatternInt = @"\d{3,}";
                //Regex RegInt = new Regex(sPatternInt);


                //if (sVal.IndexOf("~") != -1 && bFl)
                //{
                //    EnterKey(sVal);
                //}

                //if (sVal.IndexOf("~") == -1 && RegInt.IsMatch(sVal) && sVal != "0" && sVal != "0~")
                //{
                //    EnterKey(sVal);
                //}
                #endregion
        }

        /// <summary>
        /// Обработчик устанавливает фокус на грид, если в строке поиска были нажаты стрелки вверх и вниз
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Search_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 38 || e.KeyValue == 40) // стрелочки вверх и вниз
            {
                if (grdPosition.Visible)
                {
                    grdPosition.Focus();
                }
                if (grdGood.Visible)
                {
                    grdGood.Focus();
                }
            }
        }

        private void grdPosition_ProcessGridKey(object sender, KeyEventArgs e)
        {
            GridControl grid = sender as GridControl;
            GridView view = grid.FocusedView as GridView;
            if (e.KeyCode == Keys.Tab)
            {
                if ((e.Modifiers == Keys.None /* && view.IsLastRow*/ /* && view.FocusedColumn.VisibleIndex == view.VisibleColumns.Count - 1*/) || (e.Modifiers == Keys.Shift && view.IsFirstRow && view.FocusedColumn.VisibleIndex == 0))
                {
                    if (view.IsEditing)
                    {
                        view.CloseEditor();
                    }
                    Search.Focus();
                    //SelectNextControl(ExtraFunctions /*Total*/ /*grid*/, e.Modifiers == Keys.None, false, true, true);
                    e.Handled = true;
                }
            }
        }

        private void reTxtCount_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
        {
            //MessageBox.Show(e.NewValue.ToString());
            //MessageBox.Show(e.OldValue.ToString());

            //string a;
            
            //a = Convert.ToString(sender);
            //((System.String)sender).Select

                //reTxtCount
        }

        private void tempToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tableLayoutPanel2.AutoSize = true;

            tableLayoutPanel2.AutoScroll = false;
            tableLayoutPanel2.RowCount = tableLayoutPanel2.RowCount - 1;
            tableLayoutPanel2.RowStyles.RemoveAt(tableLayoutPanel2.RowCount - 1);
            tableLayoutPanel2.AutoScroll = true;

        }

        private void UseBackColorFor()
        {
            if (WorkSet.GetChemeColor() == 1 )
            {
                grdViewGoods.Appearance.Empty.BackColor = Color.FromArgb(192, 255, 192);
                grdViewGoods.Appearance.Empty.Options.UseBackColor=true;
            }
        }

        /// <summary>
        /// Событие "Закрыть форму"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dlrez= MessageBox.Show("Завершить работу ?", "JetRetail", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (dlrez == DialogResult.Yes)
            {
                OpenCheck(); 
            }
            else
            {
                e.Cancel = true;
            }
        }

        private void smiRepForDate_Click(object sender, EventArgs e)
        {
            try
            {
                if (iRegistratorType==2)
                {
                    frmReportFromSertificate frmReport = new frmReportFromSertificate(DB, iCheckKey, GetRegistratorCheckNumber(), deTotalAmount, ShtrihM);
                    if (frmReport.ShowDialog() == DialogResult.OK)
                    {
                    }
                    frmReport.Dispose();
                }
                else
                {
                    MessageBox.Show("Печать отчета по сертификатом для ФР Гепард и КСА ВМ 8119 не поддерживается", "Jet-Retail", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

               
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message, "Jet-Розница", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        string GetCashierNameToVM8119()
        {
            if (sCashier.Length - 9 >= 24)
            {
                return sCashier = sCashier.Substring(0, 24);
            }
            else
            {
                return sCashier;
            }
        }

        private void ShowError(string sErrorMessage)
        {
            MessageBox.Show(sErrorMessage, "Jet-Retail", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        /// <summary>
        /// Обработка пункта меню - продолжить печать
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ContinuePrintStMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                ShtrihM.Password = WorkSet.GetSchtrichPass();
                ShtrihM.ContinuePrint();
            }
            catch (Exception)
            {
                ShowError(ShtrihM.ResultCodeDescription);
            }

        }

        private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
            toolTipMustHaveInApt.HideHint();
          

            toolTipMustHaveInApt.ShowHint("А это текст сообщений, что товар а обязательном перечне", "Это заголовок", grdPosition, DevExpress.Utils.ToolTipLocation.BottomCenter);
        }
    }




}